Java線程狀態(tài)
Java語(yǔ)言定義了5種線程狀態(tài)境氢,在任意一個(gè)時(shí)間點(diǎn),一個(gè)線程只能有且只有其中的一個(gè)狀態(tài),這5種狀態(tài)分別如下无切。
新建(New):創(chuàng)建后尚未啟動(dòng)的線程處于這種狀態(tài)刹孔。
運(yùn)行(Runable):Runable包括了操作系統(tǒng)線程狀態(tài)中的Running和Ready啡省,也就是處于此狀態(tài)的線程有可能正在執(zhí)行,也有可能正在等待著CPU為它分配執(zhí)行時(shí)間髓霞。
-
無限期等待(Waiting):處于這種狀態(tài)的線程不會(huì)被分配CPU執(zhí)行時(shí)間卦睹,它們要等待被其他線程顯式的喚醒。以下方法會(huì)讓線程陷入無限期的等待狀態(tài):
- 沒有設(shè)置Timeout參數(shù)的Object.wait()方法方库。
- 沒有設(shè)置Timeout參數(shù)的Thread.join()方法结序。
- LockSupport.park()方法。
-
限期等待(Timed Waiting):處于這種狀態(tài)的線程也不會(huì)被分配CPU執(zhí)行時(shí)間薪捍,不過無須等待被其他線程顯式的喚醒笼痹,在一定時(shí)間之后它們會(huì)由系統(tǒng)自動(dòng)喚醒。以下方法會(huì)讓線程進(jìn)入限期等待狀態(tài):
- Thread.sleep()方法酪穿。
- 設(shè)置了Timeout參數(shù)的Object.wait()方法凳干。
- 設(shè)置了Timeout參數(shù)的Thread.join()方法。
- LockSupport.parkNanos()方法被济。
- LockSupport.parkUntil()方法救赐。
阻塞(Blocked):線程被阻塞了,“阻塞狀態(tài)”與“等待狀態(tài)”的區(qū)別是"阻塞狀態(tài)"在等待著獲取到一個(gè)排它鎖只磷,這個(gè)事件將在另外一個(gè)線程放棄這個(gè)鎖的時(shí)候發(fā)生;而“等待狀態(tài)”則是在等待一段時(shí)間经磅,或者喚醒動(dòng)作的發(fā)生。在程序等待進(jìn)入同步區(qū)域的時(shí)候钮追,線程將進(jìn)入這種狀態(tài)预厌。
結(jié)束(Terminated):已終止線程的線程狀態(tài),線程已經(jīng)結(jié)束執(zhí)行元媚。
上述5種狀態(tài)在遇到特定事件發(fā)生的時(shí)候?qū)?huì)轉(zhuǎn)換轧叽,它們的轉(zhuǎn)換關(guān)系如圖所示。