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

2021-06-17 21:53:54 字數 1924 閱讀 6823

今天學習了等待喚醒機制,通過乙個例子做個小小的總結。

需求是對某個資料進行修改和輸出操作,要求兩個操作同時進行,且先修改後輸出。

設計思路:1,需要乙個公共資料類。兩個執行緒,乙個input、乙個output。

2,input和output應該是兩個執行緒,這樣才能同時進行。

3,input和output的對資料進行修改的方法應該實現同步,以解決執行緒安全問題。

4,需要有等待喚醒機制,這樣才能實現先修改後輸出。

實現**:

//共享資源類,name和***是被修改的資料,flag作為資料被修改之後的標識。

/*input作為對資料進行寫的執行緒。output作為讀執行緒。首先應該對操作共享資料的**進行同步,鎖必須和讀執行緒使用的是同一把鎖,在這個程式中,

* 唯一的物件是共有資料物件,可以將它作為鎖。同步機制,將某個物件鎖住,只有拿到該鎖的執行緒可以對共享資料進行操作,其他執行緒沒辦法進入同步

* **中,但是一旦執行緒釋放了該鎖,那麼所有的執行緒都可以搶這個鎖,沒有先後順序,剛剛使用了鎖的執行緒又會重新加入搶鎖陣營,難免會出現乙個線

* 程連續多次對共享資料進行更改,就沒法保證執行緒的先後順序。為了使執行緒有秩序的先這個後那個,就需要在這個對共享資料操作完之後等一等,不要

* 立馬去搶鎖,這樣就可以輪到沒有持有鎖的執行緒使用鎖,因此需要等待喚醒機制。但是wait()、notify()、notifyall()方法是object

* 類中的方法,只有鎖物件可以呼叫,且wait()和notify()或者wait()和notifyall()方法的呼叫者必須是同乙個物件,使用同一把鎖。

* 且wait()方法會丟擲異常,但是由於runnable介面中的run方法沒有丟擲異常,所以即使wait()需要丟擲異常,也不能丟擲,只能通過

* try-catch處理。

class res

class input implements runnable

public void run() catch (interruptedexception e)

}if(x==0)else

r.flag=true;//完成寫操作後,將標誌位改為true,表示寫執行緒完成,喚醒其他執行緒。

r.notify();

}x=(x+1)%2;}}

}class output implements runnable

public void run()catch(interruptedexception e)

}system.out.println(r.name+"::"+r.***);

r.flag=false;//讀完之後將標誌位改為false,表示讀完,並喚醒寫執行緒。

r.notify();}}

}}public class threadcomm

}/***優化:

* 將共有資源類的成員變數私有化,並且提供對外公共方法,在公共資源類中就進行同步,簡化執行緒類。

* */

class res2catch(exception e)

}    

this.name=name;

this.***=***;

flag=true;

this.notify();

}public synchronized void get()catch(exception e)

}system.out.println(name+"::"+***);

flag=false;

this.notify();}}

class input2 implements runnable

public void run()else

x=(x+1)%2;}}

}class output2 implements runnable

public void run()}}

public class wanoyoudemo

}

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

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

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

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

Java基礎 執行緒間通訊

執行緒間的通訊 其實就是多個執行緒操作同一資源,並且操作的動作不一樣,最簡單的例子 輸入輸出姓名 性別資訊。執行緒同步保證了不會出現名字與性別對性錯誤的情況,等待喚醒機制保證了不會出現一次輸入多次輸出或多次輸入一次輸出的情況。等待 喚醒必須是同乙個鎖,喚醒機制職能喚醒跟它持有相同鎖的處於等待狀態的執...