一、等待和通知機制
1.經過前面的知識學習,我們先來看一下如果才能讓兩個執行緒互相通訊資料呢?
編碼兩個執行緒如下:
public class notifythread extends thread
@override
public void run() catch (interruptedexception e) }}
}public class becalledthread extends thread
@override
public void run() }}
} public static void main (string args)
其中notifythread執行緒和becalledthread共享乙個list,notifythread執行緒每一秒向list裡新增資料,而becalledthread執行緒則檢測list的大小,結果如下:
由於becalledthread一直在不停快速的查詢list的大小,所以導致notifythread前新增資料的日誌無法呈現出來,很快的就被覆蓋掉裡,由此可知,這樣的做法是非常消耗資源的,所以就誕生裡「等待/通訊「機制來解決優化這個問題。
2.等待/通訊機制
簡單通俗的講,等待通訊機制就是:執行緒a和執行緒b,執行緒a執行任務的前提需要某個條件成立,而這個條件並不成立,執行緒a並不需要隔一段一段時間或者是不停去查詢這個條件是否成立,而是進入等待狀態,而執行緒b或者是多個執行緒執行任務的時候將執行緒a需要的條件構建成立來了,此時會通知正在等到的執行緒a,告訴執行緒a此條件已經成立,然後執行緒a就可以做相關的操作了。(就好比酒店裡,客人點餐,服務員不需要不停詢問廚房是否做好,而是等待廚房做好了通知服務員來取餐)下面介紹一下相關方法:
3.方法join的使用
方法join()後面的**提前執行:出現意外
建立如下**:
public class threadb extends thread catch (interruptedexception e)
}}public class threada extends thread
@override
public void run() catch (interruptedexception e) }}
}public static void main (string args) throws interruptedexception
執行結果有兩種如下:
為了解釋這個現象需要更改上訴**,將main程式中的join方法注釋掉執行:
有結果來看,大部分都是`system.out.println(" main end "+system.currenttimemillis());`先執行,也就是說如果去掉之前的join()方法的注釋,那麼執行,也就很大機率先執行,由於join是同步方法,也就會獲取鎖b,然後釋放鎖b,再由執行緒a和執行緒b來爭搶鎖b,假如執行緒a先搶到鎖b,那麼執行列印begin,然後sleep且不釋放鎖,再列印end,執行完畢並釋放鎖b,此時再由之前執行的join方法和執行緒b來爭搶鎖b,誰搶到就睡執行或者繼續執行,結果就出現了一些不確定的列印結果的順序。
Java多執行緒 執行緒間通訊
一,等待 通知機制 實現執行緒間的通訊 舉個例子 我們去飯店就餐,飯店上餐的時間不確定,如果我們一直去詢問前台,是不是很煩,我麼這時就處於等待 wait 狀態,但是 飯店肯定會有人肯定會通知 notify 那個桌的菜已經做好了,前台就會通知這桌的人,菜來了。1,主要的方法wait notify 這個...
多執行緒程式設計 多執行緒間通訊(五)
一般而言 應用程式中的乙個次要執行緒總是為主執行緒執行特定的任務,這樣 主線程和次要執行緒間必定有乙個資訊傳遞的渠道,也就是主線程和次要執行緒間要進行通訊。這種執行緒間 的通訊不但是難以避免的,而且在多執行緒程式設計中也是複雜和頻繁的,下面將進行說明。使用全域性變數進行通訊 由於屬於同乙個程序的各個...
JAVA 多執行緒 執行緒間的通訊
程式設計間通訊 其實就是多個執行緒在操作同乙個資源 但是操作的動作不同 wait notify notifyall 都使用在同步中,因為要對持有的監視器 鎖 的執行緒操作 所以要使用在同步中,因為只有同步才具有鎖 將這些操作執行緒的方法定義在object類中的原因是因為這些方法在操作同步執行緒時,都...