亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

這個runnable為何只進行一個線程?

這個runnable為何只進行一個線程?

冷魘 2017-02-03 21:07:49
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();
}
}


查看完整回答
2 反對 回復 2017-02-04
?
慕粉1529473653

TA貢獻8條經驗 獲得超2個贊

你是讓窗口一的線程先開始,所以也就執行線程一,因為計算機處理很快,所以當處理完線程一的if?(ticketsCont>0)語句后解鎖然后又進入下一個循環了。

要知道計算機是從上往下處理的。

正解就是在解鎖后加入一段時間的休眠了。如云naive所示。

查看完整回答
1 反對 回復 2017-02-04
  • 3 回答
  • 0 關注
  • 1383 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號