Java多執行緒 執行緒間通訊

2021-09-20 13:11:24 字數 1818 閱讀 4087

一,等待/通知機制  實現執行緒間的通訊

舉個例子:我們去飯店就餐,飯店上餐的時間不確定,如果我們一直去詢問前台,是不是很煩,我麼這時就處於等待(wait)狀態,但是 飯店肯定會有人肯定會通知 (notify),那個桌的菜已經做好了,前台就會通知這桌的人,菜來了。

1,主要的方法wait() /notify() 這個兩個方法時object類本地方法 都要在同步方法中呼叫

1),wait() 使執行當前**的執行緒進行等待,執行完畢後,執行緒就會釋放鎖,以便別的執行緒可以獲得鎖。

2),notify(),隨機挑選乙個處於wait()的執行緒,讓他獲得鎖,但這個方法不會立即釋放當前執行緒的物件鎖,只有程式執行完畢後,才會釋放鎖。

3)sleep()方法,這個方法也是不是放鎖的 ,那麼別的執行緒要獲取這個鎖就會處於等待狀態。

4),在呼叫wait()方法後,使執行緒處於wait狀態,這時如果呼叫interrupt()就會出現interrruptedexception異常

5),notify()方法一次只會通知乙個執行緒。notifyall()通知所有的執行緒

二,使用等待/通知機制,實現生產者/消費者模式

/**

* 通知等待機制 實現消費者者/生產者模式

*/public class pcdemo

//生產者

public static class producer

public void setvalue() throws exceptionelse}}

}//消費者

public static class consumer

public void getvalue() throws exceptionelse }}

}//生產者執行緒

public static class prothread implements runnable

@override

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

}//消費者執行緒

public static class conthread implements runnable

@override

public void run()

} catch (exception e) }}

public static void main(string args) throws exception

}

執行部分截圖

這時乙個生產者,乙個消費者的情況,兩個執行緒交替執行。

若果有多個消費者,多個生產者,則有可能產生「假死」現象,就是所有的執行緒都處於waitting,因為notify()方法一次只能使乙個處於waitting狀態的執行緒掉起來。解決辦法使用notifiyall()方法即可。

三,join():等待執行緒物件銷毀,乙個主線程要等待子執行緒結束在自行結束。

1,join()內部其實使用的是wait(),

public final synchronized void join(long millis)

throws interruptedexception

if (millis == 0)

} else

wait(delay);

now = system.currenttimemillis() - base;}}

}

join()方法具有使執行緒排隊執行的作用,類似與同步的效果,但和synchroized的原理不同,後者使用 「物件監視器」原

JAVA 多執行緒 執行緒間的通訊

程式設計間通訊 其實就是多個執行緒在操作同乙個資源 但是操作的動作不同 wait notify notifyall 都使用在同步中,因為要對持有的監視器 鎖 的執行緒操作 所以要使用在同步中,因為只有同步才具有鎖 將這些操作執行緒的方法定義在object類中的原因是因為這些方法在操作同步執行緒時,都...

Java多執行緒 4 執行緒間通訊

有這麼幾個方法,它們就定義在大家都非常熟悉的object類中,但是大家卻從來沒有呼叫過,並且也不知道是做什麼的,今天就由我帶著你們熟悉一下下面的這三個方法。它們都是定義在object類中的final方法,並且只能在synchronized上下文中呼叫。如果你現在還不明白,沒關係,下面我會用乙個 生產...

Java多執行緒 執行緒間的通訊

wait notify 必須與synchronized關鍵字配合使用。wait方法釋放鎖,notify方法不釋放鎖。示例乙個阻塞佇列 public class myqueue 5 初始化乙個物件 用於加鎖 private final object lock new object put anobje...