Java線程間的通訊

兩個線程從初始化時,傳入同一個對象,可發生通訊。函數

使用static數據。線程

傳入的參數可做爲對象鎖,多個線程競爭該對象鎖。對象

1.使用wait/notify函數實現(等待/通知機制)繼承

等待/通知機制隊列

wait()使當前執行代碼的線程進行等待,將該線程置入「等待隊列中(隨時喚醒可執行狀態)」;調用wait方法前,必須獲取到該對象的對象級別的鎖(wait/notify方法繼承與Object類),即只能在同步方法或者同步塊中調用該方法。執行以後,釋放對象鎖,而且能和其餘線程一塊兒競爭該鎖。進程

帶參數wait(Long)方法等待某一段時間內是否有線程對鎖進行喚醒,若是超過則自動喚醒,long後繼續執行程序。get

notify()一樣須要獲取對象鎖才能在同步方法或者同步塊中調用該方法。該方法會通知可能在等待該對象鎖的其餘線程,若是有多個則隨機挑選一個。執行完notify以後,不會當即釋放鎖,wait中的線程也不能當即獲取鎖,要等到執行notify方法的線程將程序執行完,即退出synchronized代碼塊。notify喚醒其餘wait線程,若是對象一直沒有調用notify函數,即便對象處於空閒,鎖已經釋放,wait線程也只能一直處於等待,直到該對象調用notify/notifyAll同步

notify隨機通知一個線程喚醒,進入可執行狀態,屢次調用則喚醒多個線程。虛擬機

notifyAll使全部的wait狀態線程從等待狀態進入可執行狀態,此時優先級最高的線程最早執行,也可能隨機執行。取決於虛擬機的實現。it

2.生產者,消費者模式實現

3.join方法實現

使調用join的線程對象執行完畢run方法中的任務以後,才執行當前線程任務:

public static void main(String[] args){ try{ MyThread myThread = new MyThread(); myThread.start(); myThread.join(); Sysotem.out.println("------主線程中的任務-----"); }catch(Exception e){ } }

本來若是主線程中沒有myThread.join(),輸出函數也許會先於子線程執行完畢;加上join後,主線程將被無限期掛起,直到子線程執行完畢銷燬後才繼續執行。阻止被插入的線程的執行,先執行插入的線程。

join(Long),設置等待的時間,內部採用wait(Long)實現,具備釋放鎖的特色,因此調用以後會釋放鎖。

sleep(Long),也會等待再執行,不會釋放鎖。

4.ThrealLocal實現

ThreadLocal解決每個線程都能綁定本身的值。存放着每一個線程的私有數據。

public static ThreadLocal tl = new ThreadLocal()

[點擊並拖拽以移動]

tl.get()取值,默認第一次調用沒有值返回null。能夠繼承ThreadLocal類,重寫initailValue()方法,返回初始值。

tl.set()存值

哪一個線程調用ThreadLocal對象及其函數,則對該線程的數據進行操做。main線程調用,操做main線程數據,如果在ThreadA線程的run中調用,則是操做A線程的數據。

使用InheritableThreadLocal類在讓子線程從父線程中獲取值,例如在main函數中建立新的進程,新的進程的run函數中調用InheritableThreadLocal對象,get函數獲取main線程的數據。

相關文章
相關標籤/搜索