package com.dhcc.thread;
public class resource catch (interruptedexception e)
} this.name = name + count;
count++;
system.out.println(thread.currentthread().getname() + "..生產者 .."
+ this.name);
flag = true;
notifyall();
} public synchronized void out() catch (interruptedexception e)
} system.out.println(thread.currentthread().getname()
+ "..............消費者............" + this.name);
flag = false;
notifyall(); }}
class productor implements runnable
public void run() }}
class consumer implements runnable
public void run()
}}
之前模擬乙個生產者乙個消費者,兩個執行緒,wait notify 可以正常保證一次生產,一次消費。
現在模擬兩個生產者和兩個消費者的情況,產生的問題就是,兩次生產,一次消費。或者兩次消費,一次生產。
造成這個問題的原因是什麼呢?
就是生產者多生產了唄,或者消費者多消費了。
而再深入下去,為什麼生產者會多生產了。因為生產者生產了之後,消費者並沒有執行消費,而另乙個生產者繼續生產。
用於判斷生產和消費的flag標誌,被忽略了。當第二個生產者被喚醒的時候,並沒有判斷flag就執行下面的**,所以會繼續生產。也就是flag不起作用了。解決這個問題,if(flag) 換成 while(flag) ,這樣的話每次有生產者被喚醒都會判斷flag,這樣flag就會一直起作用。flag起作用之後,當然輪到消費者進行消費了。
package com.dhcc.thread;
public class resource catch (interruptedexception e)
} this.name = name + count;
count++;
system.out.println(thread.currentthread().getname() + "..生產者 .."
+ this.name);
flag = true;
notifyall();
} public synchronized void out() catch (interruptedexception e)
} system.out.println(thread.currentthread().getname()
+ "..............消費者............" + this.name);
flag = false;
notifyall(); }}
class productor implements runnable
public void run() }}
class consumer implements runnable
public void run()
}}
另外這樣寫還需要注意,notifyall才行,不然會死鎖。 多執行緒通訊問題
notify 喚醒正在此物件監視器上等待的單個執行緒。wait 導致當前執行緒等待它被喚醒,通常是 通知或 中斷 wait long timeoutmillis 導致當前執行緒等待它被喚醒,通常是 通知或 中斷 或者直到經過一定量的實時。wait long timeoutmillis,int nan...
多執行緒的通訊問題
1 當多個執行緒併發執行時,在預設情況下cpu是隨機切換執行緒的,每個執行緒執行的次序都是隨機的。2 如果我們需要多個執行緒共同完成乙個任務,並且希望他們有規律的執行 有可能是多執行緒間交替執行,有可能是當某個執行緒達到某個條件後才讓其他執行緒執行 就需要執行緒之間協調通訊。3 我認為處理執行緒安全...
執行緒通訊,多執行緒
多執行緒 thread handler thread處理一些複雜的業務邏輯 耗時的事情 handler在主線程中接收訊息的乙個物件 mhandler.sendmessage msg 傳送乙個訊息物件 mhandler.sendemptymessage what 傳送空訊息,只有what沒有obj m...