需求说明:
车站只剩 50 张从武汉到北京的车票,现有 3 个窗口售卖,用程序模拟售票的过程,要求使用同步方法保证售票过程中票数的正确性
创建 Java 项目,在项目中创建 SellTicketBySync 类,并实现 Runnable 接口
定义 int 类型的变量 ticket,表示剩余的车票数量,ticket 初始值为 50
创建同步方法 sellTicket()。在该方法体内,判断 ticket 的值是否大于 0。如果 ticket 的值大于 0,则调用Thread.sleep(long mills) 方法,让线程休眠 50 毫秒,并打印出当前窗口的售票情况
重写 run() 方法。在 run() 方法内,定义一个 while 死循环。在循环体内,判断变量 ticket 是否大于 0,如果 ticket 大于 0,调用 sellTicket() 方法。如果 ticket 小于等于 0,则结束循环
编写测试类,使用 new Thread(Runnable target,String name) 构造方法,创建 3 条线程,参数 target的值为 runnableInstance,指定窗口名称并赋值给参数 name。调用 3 个线程对象的 start() 方法,依次启动 3条线程
publicclassSellTicketBySyncimplementsRunnable{
privateintticket =50;//剩余的票数
//重写run方法
@Override
publicvoidrun(){
while(true) {
if(this.ticket >0) {
SellTicket();
}else{
break;
}
}
}
publicsynchronizedvoidSellTicket(){
if(ticket >0) {
try{
//线程休眠50毫秒
Thread.sleep(50);
System.out.println(Thread.currentThread().getName()+"出售第"+ticket--+"张车票");
}catch(InterruptedException e) {
e.printStackTrace();
}
}
}
publicstaticvoidmain(String[] args){
//创建一个Runnable实例
SellTicketBySync sellTicketBySync =newSellTicketBySync();
//创建3条线程,并为3条线程指定名称
Thread thread01 =newThread(sellTicketBySync,"窗口1");
Thread thread02 =newThread(sellTicketBySync,"窗口2");
Thread thread03 =newThread(sellTicketBySync,"窗口3");
thread01.start();
thread02.start();
thread03.start();
}
}
网友评论