• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

java 模拟售票,多线程的同步与互斥

JAVA相关 水墨上仙 2685次浏览

模拟售票,一个窗口售票,多个买票者购票,票数设为50 主要是利用线程间的同步于互斥
同步:线程2必须在线程1完成后才能进行
互斥:线程2和线程3访问同一变量,一次只能有一个线程访问

/**
 * 模拟售票,一个窗口售票,多个买票者购票,票数设为50 主要是利用线程间的同步于互斥 
 * 
 * 同步:线程2必须在线程1完成后才能进行
 * 互斥:线程2和线程3访问同一变量,一次只能有一个线程访问
 *
 * @author
 * 
 */
public class SaleTicket {
	public static void main(String[] args) {
		Ticket t = new Ticket(50);
		setTicket set = new setTicket(t);// 售票线程
		set.start();
		// 买票线程
		for (int i = 1; i <= 52; i++) {
			getTicket get = new getTicket(t, "买票者  " + i + " ");
			get.start();
		}
	}
}
//票对象
class Ticket {
	private int ticketNum;// 票数
	boolean write = false;// 售票与买票间的同步信号量,同一时间只有一张票卖出
	boolean read = true;// 买票者 买票间的信号量,一张票只能卖给一个人
	public Ticket(int ticketNum) {
		this.ticketNum = ticketNum;
	}
	// 取票,票数减一
	public synchronized void getTicket(String name) throws InterruptedException {
		// 售票员正忙,买票者进行等待
		while (!write && read) {
			System.out.println("*****************************" + name
					+ " 买票等待。。。");
			this.wait();
		}
		write = false;// 某个买票者要买票,售票员办理即进行等待
		if (ticketNum > 0) {
			read = false;// 让其他买票者等待
			System.out.println("*****************************" + name
					+ " 买票成功,号码=" + ticketNum);
			this.subTicketNum();// 销售一张票
			read = true;// 让其他买票者进行买票
			this.notifyAll();
		} else {// 票数为0
			read = false;
			System.out.println("*****************************票已经售完, " + name
					+ " 没有买到票");
		}
	}
	// 售票
	public synchronized void sellTicket(String name)
			throws InterruptedException {
		// 只要票数大于0,售票员就一直进行售票
		while (ticketNum > 0) {
			while (write) {
				// 进行售票
				System.out.println(name + " 处理业务,售票等待。。。");
				this.wait();
			}
			if (ticketNum > 0) {
				System.out.println(name + " 开始售票,号码=" + ticketNum);
			}
			write = true;
			this.notifyAll();
		}
		System.out.println(name + " 对不起,售票已经售完!");
	}
	public void subTicketNum() {
		if (this.ticketNum > 0)
			this.ticketNum = this.ticketNum - 1;
	}
	public int getTicketNum() {
		return ticketNum;
	}
}
// 购票者
class getTicket extends Thread {
	Ticket d;// 包含剩余票数
	String name;// 购票者姓名
	public getTicket(Ticket d, String name) {
		this.d = d;
		this.name = name;
	}
	public void run() {
		try {
			d.getTicket(name);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}
// 售票员
class setTicket extends Thread {
	Ticket d;
	public setTicket(Ticket d) {
		this.d = d;
	}
	public void run() {
		try {
			d.sellTicket("售票员 1 ");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明java 模拟售票,多线程的同步与互斥
喜欢 (0)
加载中……