编写Java程序,车站只剩 50 张从武汉到北京的车票,现有 3 个窗口售卖,用程序模拟售票的过程,使用Runnable解决线程安全问题

查看本章节

查看作业目录


需求说明:

车站只剩 50 张从武汉到北京的车票,现有 3 个窗口售卖,用程序模拟售票的过程,要求使用同步方法保证售票过程中票数的正确性

实现思路:

  1. 创建 Java 项目,在项目中创建 SellTicketBySync 类,并实现 Runnable 接口
  2. 定义 int 类型的变量 ticket,表示剩余的车票数量,ticket 初始值为 50
  3. 创建同步方法 sellTicket()。在该方法体内,判断 ticket 的值是否大于 0。如果 ticket 的值大于 0,则调用Thread.sleep(long mills) 方法,让线程休眠 50 毫秒,并打印出当前窗口的售票情况
  4. 重写 run() 方法。在 run() 方法内,定义一个 while 死循环。在循环体内,判断变量 ticket 是否大于 0,如果 ticket 大于 0,调用 sellTicket() 方法。如果 ticket 小于等于 0,则结束循环
  5. 编写测试类,使用 new Thread(Runnable target,String name) 构造方法,创建 3 条线程,参数 target的值为 runnableInstance,指定窗口名称并赋值给参数 name。调用 3 个线程对象的 start() 方法,依次启动 3条线程

实现代码:


public class SellTicketBySync implements Runnable {
	private int ticket = 50;//剩余的票数
	//重写run方法
	@Override
	public void run() {
		while (true) {
			if (this.ticket > 0) {
				SellTicket();
			} else {
				break;
			}
		}
	}
	public synchronized void SellTicket() {
		if (ticket > 0) {
			try {
				//线程休眠50毫秒
				Thread.sleep(50);
				System.out.println(Thread.currentThread().getName()+"出售第"+ticket--+"张车票");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	public static void main(String[] args) {
		//创建一个Runnable实例
		SellTicketBySync sellTicketBySync = new SellTicketBySync();
		//创建3条线程,并为3条线程指定名称
		Thread thread01 = new Thread(sellTicketBySync,"窗口1");
		Thread thread02 = new Thread(sellTicketBySync,"窗口2");
		Thread thread03 = new Thread(sellTicketBySync,"窗口3");
		thread01.start();
		thread02.start();
		thread03.start();
	}
}

 

猜你喜欢

转载自blog.csdn.net/weixin_44893902/article/details/108815711