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

2021-08-14 14:57:22 字數 2654 閱讀 1831

分析:我們期望的結果是,當輸入執行緒一次(input)操作資源(res)後,我們希望輸入執行緒 (input)失去執行權,讓輸出執行緒(output)獲取cpu執行權,當輸出執行緒(output)一次列印完成後,我們希望輸出執行緒(output)失去執行權,這時候讓輸入執行緒(input)獲取執行權,以此類推。那麼,我們理解起來就比較簡單,當輸入或者輸出執行緒執行一次完成後,自身要失去執行資格,並」叫醒」對方繼續執行。. .

先看下如下三個方法:

wait();        // 等待

notify(); // 喚醒乙個

notifyall(); // 喚醒所有

都使用在同步中,因為要對持有監視器(鎖)的執行緒操作。

所以要使用在同步中,因為只有同步才具有鎖。

為什麼這些操作執行緒的方法要定義object類中呢?

因為這些方法在操作同步中線程時,都必須要標識它們所操作執行緒持有的鎖,

只有同乙個鎖上的被等待執行緒,可以被同乙個鎖上notify喚醒。

不可以對不同鎖中的執行緒進行喚醒。

也就是說,等待和喚醒必須是同乙個鎖。

而鎖可以是任意物件,所以可以被任意物件呼叫的方法定義object類中。

解決思路 :我們可以在資源(res)上定義乙個標誌位(flag),並初始化為false,意味著輸入執行緒並未開始進行賦值。當輸入執行緒(input)每次在對資源進行操作前,都會對標誌位進行判斷,如果flase,進行賦值,否則,wait(),失去執行資格。當輸入執行緒 在 一次賦值完成後,把標誌位設定成ture,並喚醒輸出執行緒(output),假設現在輸入執行緒(input)仍舊獲取執行權,但是由於資源的標誌位為true,所以輸入執行緒(input) wait,已經失去執行權。此時,輸出執行緒(output)獲取執行權,同樣的,在輸出資源的時候,判斷資源的標誌位,為ture的時候,輸出,否則wait。當輸出執行緒(output)完成一次輸出後,將標誌位設定成true,並喚醒輸入執行緒。假設輸出執行緒此刻還未失去執行權,繼續走run方法,那麼當判斷標誌位 flag = flase,後輸出執行緒就wait 了。

**如下:

//資源

class

resource

//輸入執行緒

class

input

implements

runnable

public

void run()

else

x = (x+1)%2;

res.flag = true;

res.notify();

}else

catch(exception e)}}

}}

}//輸出執行緒

class

output

implements

runnable

@override

public

void run()

else

catch(exception e)}}

}}

}//主函式

public

class

threadwaitandnotify

}

輸出結果如下(擷取部分):

.....

輸出執行緒:傑克...男

輸出執行緒:jack...man

輸出執行緒:傑克...男

輸出執行緒:jack...man

輸出執行緒:傑克...男

輸出執行緒:jack...man

輸出執行緒:傑克...男

輸出執行緒:jack...man

輸出執行緒:傑克...男

輸出執行緒:jack...man

輸出執行緒:傑克...男

輸出執行緒:jack...man

......

需要demo的請戳這裡

下面繼續優化下**結構:

//資源

class

resource

catch(exception e){}

this.name = name;

this.*** = ***;

flag = true;

this.notify();

}public synchronized void getstring()

catch(exception e){}

system.out.println("輸出執行緒:"+name+"..."+***);

flag = false;

this.notify();

}}//輸入執行緒

class

input

implements

runnable

public

void run()

else

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

}//輸出執行緒

class

output

implements

runnable

@override

public

void run()

}}//主函式

public

class

threadwaitandnotify

}

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

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

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

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

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

今天學習了等待喚醒機制,通過乙個例子做個小小的總結。需求是對某個資料進行修改和輸出操作,要求兩個操作同時進行,且先修改後輸出。設計思路 1,需要乙個公共資料類。兩個執行緒,乙個input 乙個output。2,input和output應該是兩個執行緒,這樣才能同時進行。3,input和output的...