多執行緒通訊問題公升級

2021-09-28 22:27:47 字數 1803 閱讀 6247

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...