執行緒間的通訊 等待喚醒機制

2021-06-26 18:16:59 字數 2446 閱讀 6347

執行緒間的通訊

同步執行緒必須滿足兩個條件:

一:兩個或兩個以上的執行緒

二:都使用同乙個鎖物件

題目描述:

首先有乙個資源池(resource),輸入執行緒(input)不斷往資源池內新增內容,輸出執行緒(output)不斷往外輸出內容

並且兩個執行緒需要同步。需要的結果是,輸入執行緒輸入乙個內容,然後立馬輸出執行緒讀出乙個內容。

第一次編寫**,不使用同步,也不是用等待喚醒機制

/**

* 執行緒間的通訊:--------等待喚醒機制

* 題目描述:

* 首先由乙個資源池(resource),輸入執行緒(input)不斷往資源池內新增內容,輸出執行緒(output)不斷往外輸出內容

* 並且兩個執行緒需要同步

出現上面情況,「mike------女」和「麗麗------man」明顯感覺到很奇怪

解釋原因:輸入執行緒沒有對輸入完成的時候,輸出執行緒就搶占了cpu,直接執行輸出執行緒,因此才會有以上的奇怪現象

解決方案:加入執行緒同步,使輸入執行緒和輸出執行緒同步。對資源的操作時候就只有輸入執行緒完成賦值後輸出執行緒有能執行

加入執行緒同步塊後的**如下:

/*

執行緒間的通訊:--------等待喚醒機制

題目描述:

首先由乙個資源池(resource),輸入執行緒(input)不斷往資源池內新增內容,輸出執行緒(output)不斷往外輸出內容

並且兩個執行緒需要同步

但是問題又出現了,出現的全部是一樣的結構,安裝預期的應該是,乙個「mike-----man」然後乙個「麗麗------女」。但是為什麼會出現這種情況呢?

這是由於輸入執行緒獲得cpu以後,多次賦值,等到輸出執行緒獲得cpu的時候就會一次輸出好多的同樣資料

解決方案:加入等待喚醒機制

/*

執行緒間的通訊:--------等待喚醒機制

題目描述:

首先有乙個資源池(resource),輸入執行緒(input)不斷往資源池內新增內容,輸出執行緒(output)不斷往外輸出內容

並且兩個執行緒需要同步

* */

class resource

class input implements runnable

@override

public void run() catch(exception e){};

synchronized (r)

else

r.flag = true;

//喚醒在此物件監視器上等待的單個執行緒。如果所有執行緒都在此物件上等待,則會選擇喚醒其中乙個執行緒

r.notify(); //即也就是喚醒output執行緒}}

最後可以看出,得出了我想要的結果

執行緒間通訊 等待喚醒機制

執行緒間通訊 其實就是多個執行緒在操作同乙個資源,但是操作的動作不同 class res2 class input2 implements runnable public void run catch interruptedexception e if x 0 else x x 1 2 r.flag...

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

等待喚醒機制 涉及方法 1 wait 讓執行緒處於凍結狀態,被wait的執行緒會儲存到執行緒池中 2 notify 喚醒執行緒池中任一線程 隨機 3 nitifyall 喚醒執行緒池中所有執行緒 這些方法必須定義在同步中,因為這些方法是用於操作執行緒狀態的方法,必須要明確操作的是哪個鎖上的執行緒 這...

Java 執行緒間通訊 等待喚醒機制

分析 我們期望的結果是,當輸入執行緒一次 input 操作資源 res 後,我們希望輸入執行緒 input 失去執行權,讓輸出執行緒 output 獲取cpu執行權,當輸出執行緒 output 一次列印完成後,我們希望輸出執行緒 output 失去執行權,這時候讓輸入執行緒 input 獲取執行權,...