java 多執行緒 等待喚醒機制

2021-06-26 12:55:06 字數 1776 閱讀 6355

package thread執行緒;

//生產者消費者問題

//問題1:為什麼要用while而不用if進行判斷:因為是多執行緒在操作同一資源,即有多個生產者也有多個消費者,如果用if進行判斷的話會出現生產者生產連續生產多次,而消費者只消費

//消費一次,或生產者生產一次消費者消費多次的錯誤資訊,這是為什麼呢?原因如下:

/*正常情況下:程式執行標記flag的初始值為false,當生產者t1去執行set方法時,如果是if語句它判斷標記flag為false即讓生產者生產,t1讀到flag=true時將

* 標記置為true,然後讀到notifyall()的時候,會喚醒執行緒池中等待的其他執行緒t2、t3、t4,這個時候t1還具有cpu的執行權和執行資格,t1又重新執行sort方法

* 這個時候標記flag已經為true,當t1讀到if語句的時候就會執行if語句中的內容wait(),t1被凍結釋放出執行權和鎖,這時候被喚醒的t2、t3、t4就會搶奪cpu執行權

* 如果生產者t2搶到了cpu執行權,那麼它就會執行set()方法,當t2讀到if語句的時候這時候標記flag=true,所以t2也會執行wait()方法進行等待,這個時候活著的

* 執行緒有t3和t4,它們兩個就會搶奪cpu執行權。假如t3搶到了cpu執行權那麼它就會執行out()方法,當讀到if語句的時候這時候標記flag=true,它就會執行列印語句即

* 消費者進行消費,當t3讀到flag=flase的時候就會將標記置為flase,讀到notifyall()的時候就會喚醒凍結中的t1和t2使他們從凍結狀態轉變為臨時狀態(擁有執行資格但是沒有執行權)

* t1、t2、t3就會搶奪cpu執行權,如果t2搶到cpu的執行權(應該還記得t2已經讀過了if判斷語句,那麼他就不會再去讀if語句而是向下執行)生產者生產產品,讀到flag=true

* 就會將標記flag設定為true,帶到notifyall()就會喚醒其它執行緒,這時候活著的執行緒有t1、t3、t4,如果t1搶到了cpu的執行權(還記得剛才t1也是讀了if語句以後

* 才凍結的,它醒後和t2一樣也會向下執行)這樣生產者就又生產了一次產品,這樣就出現了生產兩次而消費一次,同理生產一次消費兩次也是這個原因。

* 將* */

public class 生產者消費者

}class resource1

public synchronized void set(string name)catch(exception e);

this.count=count+1;

this.name=name+"----"+this.count;

system.out.println(thread.currentthread().getname()+"---生產者----"+this.name);

flag=true;

this.notifyall();

} public synchronized void out()catch(exception e);

system.out.println(thread.currentthread().getname()+"----消費者----"+name);

flag=false;

notifyall(); }}

class producer implements runnable

@override

public void run()

} }class consumer implements runnable

@override

public void run()

}}

java多執行緒等待喚醒機制

等待喚醒機制 object類中提供了三個方法 wait 等待 notify 喚醒單個執行緒 notifyall 喚醒所有執行緒 為什麼這些方法不定義在thread類而定義在object類中呢?這些方法的呼叫必須通過鎖物件呼叫,而我們使用的鎖物件是任意鎖物件。所以,這些方法必須定義在object類中。...

java多執行緒通訊之等待喚醒機制

多執行緒間通訊,其實就是多個執行緒操操作同乙個資源,但是操作方式不同。典型例項有生產者和消費者,本文也通過例項來分析執行緒等待喚醒機制。public final void notify 喚醒在此物件監視器上等待的單個執行緒,如果所有執行緒都在此物件上等待,則會任意選擇喚醒其中乙個執行緒。public...

多執行緒06 執行緒通訊(等待喚醒機制)

多個執行緒在操作同乙個資源,但是操作的動作不同。比如我們之前看的賣票,多個執行緒操作動作相同,都是賣票,就不屬於執行緒通訊 比如乙個執行緒存錢,乙個執行緒取錢,就屬於執行緒通訊。怎麼辦呢?解決的方法就是加同步,同步需要滿足兩個前提 第一 必須有兩個或者兩個以上的執行緒 第二 多個執行緒必須使用同一把...