public class Runnable01 implements Runnable{ private int ticketsCont=50; private Lock lock=new ReentrantLock(); public Runnable01() { // TODO Auto-generated constructor stub } public void run(){ while(true){ lock.lock(); if (ticketsCont>0) { ticketsCont--; System.out.println(Thread.currentThread().getName()+"卖了1张,剩余为:"+ticketsCont); } lock.unlock(); if (ticketsCont==0) { break; } } } public static void main(String[] args) throws InterruptedException { Runnable01 mt=new Runnable01(); Thread th1=new Thread(mt,"窗口1"); Thread th2=new Thread(mt,"窗口2"); Thread th3=new Thread(mt,"窗口3"); th1.start(); th2.start(); th3.start(); }}重复了几次,都是产生这种结果,不应该是1,2,3窗口都有么?:窗口1卖了1张,剩余为:49窗口1卖了1张,剩余为:48窗口1卖了1张,剩余为:47窗口1卖了1张,剩余为:46窗口1卖了1张,剩余为:45窗口1卖了1张,剩余为:44窗口1卖了1张,剩余为:43窗口1卖了1张,剩余为:42窗口1卖了1张,剩余为:41窗口1卖了1张,剩余为:40窗口1卖了1张,剩余为:39窗口1卖了1张,剩余为:38窗口1卖了1张,剩余为:37窗口1卖了1张,剩余为:36窗口1卖了1张,剩余为:35窗口1卖了1张,剩余为:34窗口1卖了1张,剩余为:33窗口1卖了1张,剩余为:32窗口1卖了1张,剩余为:31窗口1卖了1张,剩余为:30窗口1卖了1张,剩余为:29窗口1卖了1张,剩余为:28窗口1卖了1张,剩余为:27窗口1卖了1张,剩余为:26窗口1卖了1张,剩余为:25窗口1卖了1张,剩余为:24窗口1卖了1张,剩余为:23窗口1卖了1张,剩余为:22窗口1卖了1张,剩余为:21窗口1卖了1张,剩余为:20窗口1卖了1张,剩余为:19窗口1卖了1张,剩余为:18窗口1卖了1张,剩余为:17窗口1卖了1张,剩余为:16窗口1卖了1张,剩余为:15窗口1卖了1张,剩余为:14窗口1卖了1张,剩余为:13窗口1卖了1张,剩余为:12窗口1卖了1张,剩余为:11窗口1卖了1张,剩余为:10窗口1卖了1张,剩余为:9窗口1卖了1张,剩余为:8窗口1卖了1张,剩余为:7窗口1卖了1张,剩余为:6窗口1卖了1张,剩余为:5窗口1卖了1张,剩余为:4窗口1卖了1张,剩余为:3窗口1卖了1张,剩余为:2窗口1卖了1张,剩余为:1窗口1卖了1张,剩余为:0
3 回答
已采纳
按照自己的节奏前行
TA贡献90条经验 获得超70个赞
public class Runnable01 implements Runnable{ private int ticketsCont=50; private Lock lock=new ReentrantLock(); public Runnable01() { // TODO Auto-generated constructor stub } public void run(){ while(true){ lock.lock(); if (ticketsCont>0) { ticketsCont--; System.out.println(Thread.currentThread().getName()+"卖了1张,剩余为:"+ticketsCont); } lock.unlock(); //一般在这里加个暂停时间,给其他线程让步下就好了,看这里看这里看这里!!!------ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } if (ticketsCont==0) { break; } } } public static void main(String[] args) throws InterruptedException { Runnable01 mt=new Runnable01(); Thread th1=new Thread(mt,"窗口1"); Thread th2=new Thread(mt,"窗口2"); Thread th3=new Thread(mt,"窗口3"); th1.start(); th2.start(); th3.start(); } }
慕粉1529473653
TA贡献8条经验 获得超2个赞
你是让窗口一的线程先开始,所以也就执行线程一,因为计算机处理很快,所以当处理完线程一的if (ticketsCont>0)语句后解锁然后又进入下一个循环了。
要知道计算机是从上往下处理的。
正解就是在解锁后加入一段时间的休眠了。如云naive所示。
添加回答
举报
0/150
提交
取消