一堰塌、線程的六種狀態(tài)
- New(新創(chuàng)建)
- Runnable(可運行)
- Blocked(被阻塞)
- Waiting(等待)
- Timed waiting(計時等待)
- Terminated(被終止)
①可以通過Thread的getState()的實例方法獲取線程的狀態(tài)详囤。
②new狀態(tài)是指new Thread()被調(diào)用后,start()被調(diào)用之前服傍。
③Runnable狀態(tài)是指start()被調(diào)用之后曲稼,其是否運行取決于操作系統(tǒng)給線程提供的運行時間。
④阻塞狀態(tài)是指線程在試圖獲取一內(nèi)部的對象鎖,而該鎖被其他線程持有佑淀,則該線程進入阻塞狀態(tài)。
⑤等待狀態(tài)是指卷要,當線程等待另一個線程通知調(diào)度器一個條件時渣聚,它自己進入等待狀態(tài)。
⑥線程的終止a.因為run方法正常退出而自然死亡僧叉,b因為一個沒有捕獲的異常而意外死亡奕枝。
二、 join方法
join方法用于協(xié)調(diào)多個線程的工作瓶堕,即有時候我們可能將任務(wù)分成了兩部分以上隘道,而有一部分可能會先執(zhí)行完但又需要用到其他任務(wù)的執(zhí)行結(jié)果。這個時候就可以用join方法來等待其他任務(wù)執(zhí)行完郎笆。
//t1線程用于計算x變量谭梗,t2線程則用于輸出x變量
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try{
Thread.sleep(5000);
x = 300;
}catch (Exception e){
System.out.println(e.getMessage());
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
t1.join();
System.out.println(x);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t1.start();
t2.start();
假設(shè)x為線程實例,x.join方法使得當前線程(即執(zhí)行這條語句的線程)在x線程執(zhí)行完畢(終止狀態(tài))之前進入阻塞狀態(tài)宛蚓。
當線程在join某個線程的時候(處于等待狀態(tài)的時候)被中斷將引發(fā)InterruptedException異常激捏。所以調(diào)用join方法時需要處理InterruptExcepiton異常。join方法的內(nèi)部實現(xiàn)是wait(long)凄吏,具有釋放鎖的特點远舅。
三、synchronized用法總結(jié)
- synchronized(同步的意思)痕钢,主要有兩種用法即①修飾方法图柏,②修飾代碼塊;修飾的方法如果是實例方法任连,則同一個對象的所有synchronized方法在同一時刻最多只能被一個線程訪問蚤吹,如果修飾的方法是靜態(tài)類方法,則同一個類中所有synchronized方法在同一個時刻最多只能被一個線程訪問随抠。synchronized代碼塊根據(jù)修飾的是對象還是累也具有類似的效果裁着,主要區(qū)別是方法是對當前對象或當前類進行枷鎖,而synchronized代碼塊是對某一個對象或某個類進行枷鎖拱她,同時synchronized同步語句塊的粒度更加小跨算,可以將那些可以異步的耗時操作放在同步塊之外,從而提高系統(tǒng)效率椭懊。
- synchronized鎖重入,synchronized方法/塊的內(nèi)部調(diào)用本類或本對象的其他synchronized方法/塊時,總是可以得到鎖的氧猬。如果沒有這個特性背犯,會造成死鎖≈迅В可重入鎖支持在父子類繼承的環(huán)境中漠魏。但當子類重寫父類的synchronized方法時將無法繼承synchronized這一同步特性,必須為復(fù)寫方法加上synchronized關(guān)鍵字妄均。
- 一個線程如果出現(xiàn)異常柱锹,它鎖持有的鎖會自動釋放。