線程的五大狀態(tài),以及線程之間的通信與協(xié)作

多線程的基本概念

1.進程

進程是操作系統(tǒng)進行資源分配和調(diào)度的基本單位。

2.線程

線程是進程中的一個執(zhí)行單元,負責(zé)當前進程中程序的執(zhí)行,一個進程中至少有一個線程。

3.多線程

什么是多線程呢?即就是一個程序中有多個線程在同時執(zhí)行。

02

線程的生命周期

java中每個線程都需經(jīng)歷新生、就緒、運行、阻塞和死亡五種狀態(tài),線程從新生到死亡的狀態(tài)變化稱為生命周期。

1.新建狀態(tài)

使用 new Thread 類或其子類建立一個線程對象后,該線程對象就處于新建狀態(tài)。

2.就緒狀態(tài)

調(diào)用了start()方法之后,該線程就進入就緒狀態(tài)(就緒隊列中),等待JVM里線程調(diào)度器的調(diào)度。

3.運行狀態(tài)

執(zhí)行 run(),此時線程便處于運行狀態(tài)。處于運行狀態(tài)的線程最為復(fù)雜,它可以變?yōu)樽枞麪顟B(tài)、就緒狀態(tài)和死亡狀態(tài)。

4.阻塞狀態(tài)

如果一個線程執(zhí)行了sleep(睡眠)、suspend(掛起)等方法,失去所占用資源之后,該線程就從運行狀態(tài)進入阻塞狀態(tài)。

5.死亡狀態(tài)

一個運行狀態(tài)的線程完成任務(wù)或者其他終止條件發(fā)生時,該線程就切換到終止狀態(tài)。

03

線程的調(diào)度策略

線程調(diào)度是指系統(tǒng)為線程分配處理器使用權(quán)的過程。

Java?使用的線程調(diào)度是搶占式調(diào)度,在搶占式調(diào)度下,優(yōu)先級最高的任務(wù)一直執(zhí)行,直到它進入等待或死亡狀態(tài)或更高優(yōu)先級的任務(wù)出現(xiàn),優(yōu)先級高的線程比優(yōu)先級低的線程優(yōu)先執(zhí)行。

在Java多線程環(huán)境中,為保證所有線程的執(zhí)行能按照一定的規(guī)則執(zhí)行,JVM實現(xiàn)了一個線程調(diào)度器,它定義了線程調(diào)度的策略。 在?JVM?中體現(xiàn)為讓可運行池中優(yōu)先級高的線程擁有CPU?使用權(quán)。

04

線程之間的通信與協(xié)作

上面比較清楚的顯示了線程的狀態(tài)流轉(zhuǎn),其實重點主要是掌握運行、阻塞、就緒之間的通信機制。

1.sleep()和yield()和join()

1)sleep()方法作用:讓當前線程睡眠一段時間,期間不會釋放任何持有的鎖。

2) yield()方法作用:讓出該線程的時間片給其它線程。線程調(diào)用了yield()方法,表示放棄當前獲得的CPU時間片,回到就緒狀態(tài)。最后由線程調(diào)度重新選擇就緒狀態(tài)的線程分配CPU資源。

3)join()方法作用:暫停當前線程,等待被調(diào)用線程指向結(jié)束之后再繼續(xù)執(zhí)行。

注意:

1)sleep(long)方法僅釋放CPU使用權(quán),鎖仍然占用。

2)調(diào)用join()的時候,當前線程不會釋放掉鎖。

2.wait()和notify() 方法和notifyAll()方法

1)wait()方法的作用:讓該線程處于等待狀態(tài)。

2)notify()方法的作用:喚醒處于wait的線程。

3)notifyAll()方法的作用:喚醒所有處于wait狀態(tài)的線程。

注意:

1)wait()方法會釋放CPU執(zhí)行權(quán) 和 占有的鎖。

2) 線程調(diào)用wait()方法后,讓該線程處于等待狀態(tài)。進入這個狀態(tài)后,是不能自動喚醒的,必須依靠其他線程調(diào)用notify()或notifyAll()方法才能被喚醒。wait和notify必須配套使用,即必須使用同一把鎖調(diào)用。

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

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

  • 林炳文Evankaka原創(chuàng)作品。轉(zhuǎn)載自http://blog.csdn.net/evankaka 本文主要講了ja...
    ccq_inori閱讀 731評論 0 4
  • Java多線程學(xué)習(xí) [-] 一擴展javalangThread類 二實現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 3,106評論 1 18
  • 本文主要講了java中多線程的使用方法、線程同步、線程數(shù)據(jù)傳遞、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法、概述等。 首先講...
    李欣陽閱讀 2,593評論 1 15
  • ??一個任務(wù)通常就是一個程序,每個運行中的程序就是一個進程。當一個程序運行時,內(nèi)部可能包含了多個順序執(zhí)行流,每個順...
    OmaiMoon閱讀 1,801評論 0 12
  • 本文出自 Eddy Wiki ,轉(zhuǎn)載請注明出處:http://eddy.wiki/interview-java.h...
    eddy_wiki閱讀 2,297評論 0 14

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