筆記:Java多線程

4. 線程狀態(tài)的轉(zhuǎn)換

線程的狀態(tài)轉(zhuǎn)換是線程控制的基礎(chǔ)。線程狀態(tài)總的可分為五大狀態(tài):分別是生、死、可運(yùn)行、運(yùn)行、等待/阻塞。

  • 新狀態(tài):線程對(duì)象已經(jīng)創(chuàng)建,還沒有在其上調(diào)用start()方法。
  • 可運(yùn)行狀態(tài):當(dāng)線程有資格運(yùn)行,但調(diào)度程序還沒有把它選定為運(yùn)行線程時(shí)線程所處的狀態(tài)。當(dāng)start()方法調(diào)用時(shí),線程首先進(jìn)入可運(yùn)行狀態(tài)。在線程運(yùn)行之后或者從阻塞、等待或睡眠狀態(tài)回來后,也返回到可運(yùn)行狀態(tài)。
  • 運(yùn)行狀態(tài):線程調(diào)度程序從可運(yùn)行池中選擇一個(gè)線程作為當(dāng)前線程時(shí)線程所處的狀態(tài)。這也是線程進(jìn)入運(yùn)行狀態(tài)的唯一一種方式。
  • 等待/阻塞/睡眠狀態(tài):這是線程有資格運(yùn)行時(shí)它所處的狀態(tài)。實(shí)際上這個(gè)三狀態(tài)組合為一種,其共同點(diǎn)是:線程仍舊是活的,但是當(dāng)前沒有條件運(yùn)行。換句話說,它是可運(yùn)行的,但是如果某件事件出現(xiàn),他可能返回到可運(yùn)行狀態(tài)。
  • 死亡態(tài):當(dāng)線程的run()方法完成時(shí)就認(rèn)為它死去。這個(gè)線程對(duì)象也許是活的,但是,它已經(jīng)不是一個(gè)單獨(dú)執(zhí)行的線程。線程一旦死亡,就不能復(fù)生。 如果在一個(gè)死去的線程上調(diào)用start()方法,會(huì)拋出java.lang.IllegalThreadStateException異常。(例如destory()后,調(diào)用start())

小結(jié)

到目前位置,介紹了線程離開運(yùn)行狀態(tài)的3種方法:

  • 1、調(diào)用Thread.sleep():使當(dāng)前線程睡眠至少多少毫秒(盡管它可能在指定的時(shí)間之前被中斷)。
  • 2、調(diào)用Thread.yield():不能保障太多事情,盡管通常它會(huì)讓當(dāng)前運(yùn)行線程回到可運(yùn)行性狀態(tài),使得有相同優(yōu)先級(jí)的線程有機(jī)會(huì)執(zhí)行。
  • 3、調(diào)用join()方法:保證當(dāng)前線程停止執(zhí)行,直到該線程所加入的線程完成為止。然而,如果它加入的線程沒有存活,則當(dāng)前線程不需要停止。
    除了以上三種方式外,還有下面幾種特殊情況可能使線程離開運(yùn)行狀態(tài):
  • 1、線程的run()方法完成。
  • 2、在對(duì)象上調(diào)用wait()方法(不是在線程上調(diào)用)。
  • 3、線程不能在對(duì)象上獲得鎖定,它正試圖運(yùn)行該對(duì)象的方法代碼。
  • 4、線程調(diào)度程序可以決定將當(dāng)前運(yùn)行狀態(tài)移動(dòng)到可運(yùn)行狀態(tài),以便讓另一個(gè)線程獲得運(yùn)行機(jī)會(huì),而不需要任何理由。

5. 線程的同步與鎖

synchronized

一個(gè)對(duì)象只有一個(gè)鎖。所以,如果一個(gè)線程獲得該鎖,就沒有其他線程可以獲得鎖,直到第一個(gè)線程釋放(或返回)鎖。這也意味著任何其他線程都不能進(jìn)入該對(duì)象上的synchronized方法或代碼塊,直到該鎖被釋放。釋放鎖是指持鎖線程退出了synchronized同步方法或代碼塊。

靜態(tài)方法同步

要同步靜態(tài)方法,需要一個(gè)用于整個(gè)類對(duì)象的鎖,這個(gè)對(duì)象是就是這個(gè)類(XXX.class)

參考資料


java多線程編程總結(jié)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java多線程學(xué)習(xí) [-] 一擴(kuò)展javalangThread類 二實(shí)現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 3,106評(píng)論 1 18
  • 本文主要講了java中多線程的使用方法、線程同步、線程數(shù)據(jù)傳遞、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法、概述等。 首先講...
    李欣陽(yáng)閱讀 2,594評(píng)論 1 15
  • 該文章轉(zhuǎn)自:http://blog.csdn.net/evankaka/article/details/44153...
    加來依藍(lán)閱讀 7,465評(píng)論 3 87
  • 寫在前面的話: 這篇博客是我從這里“轉(zhuǎn)載”的,為什么轉(zhuǎn)載兩個(gè)字加“”呢?因?yàn)檫@絕不是簡(jiǎn)單的復(fù)制粘貼,我花了五六個(gè)小...
    SmartSean閱讀 4,936評(píng)論 12 45
  • 有個(gè)姑娘給了我盛了碗雞湯。 她說,上帝最喜歡的孩子,都是被他咬了一大口的蘋果。 我用力捏了捏肚子上的肥肉,想了想,...
    cheryl喲閱讀 328評(píng)論 9 7

友情鏈接更多精彩內(nèi)容