線程生命周期與方法 2018-05-13

1.?多線程:

(1)?多線程,同一時間,做多件事情

(2)?同一個時間點,只能做一件事情

(3)?同步與異步

2.?Java中的多線程:

從main方法入口,啟動Main線程,兩種多線程實現(xiàn)方式

(1)?繼承Thread類

(2)實現(xiàn)Runnable接口,這個是推薦使用

原因:

(1)?Java是單繼承,可以實現(xiàn)多個接口

(2)?Runnable本身是任務的概念

3.?進程與線程:

(1)?進程:CPU分配資源的最小單位

(2)?線程:本身不占用資源,但是要消耗進程分配的資源

(3)?一個應用進程有多個進程,一個進程有多個線程

4.?生命周期

(1)?狀態(tài):

a.?新建狀態(tài)(New):創(chuàng)建一個線程對象

b.就緒狀態(tài)(Runnable):線程對象創(chuàng)建后,其他線程調(diào)用該對象的start()方法。該狀態(tài)的線程位于可運行線程池中,變得可運行,等待獲取CPU的使用權(quán)

c.運行狀態(tài)(Running):就緒狀態(tài)的線程獲取CPU,執(zhí)行程序代碼

d.?阻塞狀態(tài)(Blocked):阻塞狀態(tài)是線程因為某種原因放棄CPU使用權(quán),暫時停止運行。直到線程進入就緒狀態(tài),才有機會轉(zhuǎn)到運行狀態(tài)

e.等待阻塞:運行的線程執(zhí)行wait()方法,JVM會把該線程放入等待池中(wait會釋放持有的鎖)

f.同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池中

g.其他阻塞:運行的線程執(zhí)行sleep()或join()方法,或者發(fā)出I/O請求時,JVM會把該線程置為阻塞狀態(tài)。當sleep()狀態(tài)超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉(zhuǎn)入就緒狀態(tài)。

h.死亡狀態(tài)(Dead):線程執(zhí)行完了或者因異常退出run()方法,該線程結(jié)束生命周期

(2)?常用方法

a.?靜態(tài)方法:sleep()\yield()

b.?普通方法:join()、wait()、notify()、notifyAll()、setPriority()、currentThread()

5.?線程同步和線程通信

(1)?線程同步:將操作共享數(shù)據(jù)的代碼作為一個整體,同一時間只允許一個線程執(zhí)行,執(zhí)行過程中其他線程不能參與執(zhí)行。

目的:防止多個線程訪問一個數(shù)據(jù)對象時,對數(shù)據(jù)造成的破壞

①?同步方法:與有可能發(fā)生資源共享的方法添加synchronized關(guān)鍵字修飾

Public synchronized void run(){}

②?同步代碼塊:有可能發(fā)生資源共競的代碼塊,給它加一個同步鎖,即在代碼塊前添加synchronized來修飾

Synchronized (obj){}

③同步鎖(Lock):Lock對象與資源對象同樣具有一對一的關(guān)系

Class XX{

//顯示定義Lock同步鎖對象,此對象與共享資源具有一對一關(guān)系

Private final Lock lock=new ReentrantLock();

Public void mx{

//加鎖

Lock.lock();

//需要進行線程安全同步的代碼


//釋放同步鎖

Lock.unlock();

}

}

(2)?線程通信:

①?Wait():導致當前線程等待并使其進入到等待阻塞狀態(tài)。知道其他線程調(diào)用該同步鎖對象的notify()或notifyAll()方法來喚醒此線程

②?Notify():喚醒在此同步鎖對象上等待的單個線程,如果有多個線程都在此同步鎖對象等待,則會任意選擇其中某個線程進行喚醒操作,只有當前線程放棄對同步鎖對象的鎖定,才可能執(zhí)行被喚醒的線程.

③?notifyAll():喚醒在此同步鎖對象上等待的所有線程,只有當前線程放棄對同步鎖對象的鎖定,才可能執(zhí)行被喚醒的線程

這三個方法都是Object中的方法,必須與synchronized一起使用

Wait()與sleep()區(qū)別:

1)?wait()是Object類的方法,sleep()是Thread類的靜態(tài)方法

2)?Wait()必須與synchronized一起使用,sleep()則不用

3)?Wait()完,線程進入等待隊列,而sleep()完,線程會進入阻塞隊列

4)?Wait()方法會釋放同步鎖,而sleep()則不會釋放同步鎖

5)都會拋出InterruptedException

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

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

  • 1.解決信號量丟失和假喚醒 public class MyWaitNotify3{ MonitorObject m...
    Q羅閱讀 1,015評論 0 1
  • Java多線程學習 [-] 一擴展javalangThread類 二實現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 3,112評論 1 18
  • 本文主要講了java中多線程的使用方法、線程同步、線程數(shù)據(jù)傳遞、線程狀態(tài)及相應的一些線程函數(shù)用法、概述等。 首先講...
    李欣陽閱讀 2,600評論 1 15
  • 我喜歡你/ 踏遍萬里 我喜歡你/ 不問歸期 我喜歡你/ 草木...
    _Pansey閱讀 158評論 0 4
  • 國外如何抓安全生產(chǎn):德國篇 中央政府門戶網(wǎng)站www.gov.cn 2006年01月22日 來源:新華社 【字體:大...
    Ewalnut閱讀 210評論 0 0

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