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
提交
取消