国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java線程的生命周期

ivyzhang / 2856人閱讀

摘要:線程的生命周期線程的生命周期大致可以分為下面五種狀態(tài)新建狀態(tài)就緒狀態(tài)運(yùn)行狀態(tài)休眠狀態(tài)終止?fàn)顟B(tài)新建狀態(tài),是線程被創(chuàng)建且未啟動(dòng)的狀態(tài)這里的創(chuàng)建,僅僅是在的這種編程語言層面被創(chuàng)建,而在操作系統(tǒng)層面,真正的線程還沒有被創(chuàng)建。

概要

目前CPU的運(yùn)算速度已經(jīng)達(dá)到了百億次每秒,甚至更高的量級(jí),家用電腦即使維持操作系統(tǒng)正常運(yùn)行的進(jìn)程也會(huì)有數(shù)十個(gè),線程更是數(shù)以百計(jì)。

線程是CPU的調(diào)度和分派的基本單位,為了更充分地利用CPU資源以及提高生產(chǎn)率和高效地完成任務(wù),在現(xiàn)實(shí)場(chǎng)景中一般都會(huì)采用多線程處理。

線程的生命周期

線程的生命周期大致可以分為下面五種狀態(tài):New(新建狀態(tài))、RUNABLE(就緒狀態(tài))、RUNNING(運(yùn)行狀態(tài))、休眠狀態(tài)DEAD(終止?fàn)顟B(tài))

1、新建狀態(tài),是線程被創(chuàng)建且未啟動(dòng)的狀態(tài);這里的創(chuàng)建,僅僅是在JAVA的這種編程語言層面被創(chuàng)建,而在操作系統(tǒng)層面,真正的線程還沒有被創(chuàng)建。

Thread t1 = new Thread()

2、就緒狀態(tài),指的是調(diào)用start()方法之后,線程等待分配給CPU執(zhí)行(這時(shí)候,線程已經(jīng)在操作系統(tǒng)層面被創(chuàng)建)

t1.start()

3、運(yùn)行狀態(tài),當(dāng)CPU空閑時(shí),線程被分得CPU時(shí)間片,執(zhí)行Run()方法的狀態(tài)

4、休眠狀態(tài),運(yùn)行狀態(tài)的線程,如果調(diào)用一個(gè)阻塞的API或者等待某個(gè)事件,那么線程的狀態(tài)就會(huì)轉(zhuǎn)換到休眠狀態(tài),一般有以下幾種情況

同步阻塞:鎖被其它線程占用

主動(dòng)阻塞:調(diào)用Thread的某些方法,主動(dòng)讓出CPU執(zhí)行權(quán),比如:sleep()、join()等方法

等待阻塞:執(zhí)行了wait()方法

5、終止?fàn)顟B(tài),線程執(zhí)行完(run()方法執(zhí)行結(jié)束)或者出現(xiàn)異常就會(huì)進(jìn)入終止?fàn)顟B(tài)

對(duì)應(yīng)的是JAVA中Thread類State中的六種狀態(tài)

public class Thread implements Runnable {
   //.........
    
    public enum State {
        NEW, // 初始化狀態(tài)
      
        RUNNABLE, // 可運(yùn)行/運(yùn)行狀態(tài)
      
        BLOCKED, // 阻塞狀態(tài)
        
        WAITING, // 無時(shí)限等待
       
        TIMED_WAITING, // 有時(shí)限等待
  
        TERMINATED; // 終止?fàn)顟B(tài)
    }
   
    // ..........
}
休眠狀態(tài)(BLOCKEDWAITINGTIMED_WAITING)與RUNNING狀態(tài)的轉(zhuǎn)換

1、RUNNING狀態(tài)與BLOCKED狀態(tài)的轉(zhuǎn)換

線程等待 synchronized 的隱式鎖,RUNNING —> BLOCKED

線程獲得 synchronized 的隱式鎖,BLOCKED —> RUNNING

2、RUNNING狀態(tài)與WAITING狀態(tài)的轉(zhuǎn)換

獲得 synchronized 隱式鎖的線程,調(diào)用無參數(shù)的Object.wait()方法

調(diào)用無參數(shù)Thread.join()方法

調(diào)用LockSupport.park()方法,線程阻塞切換到WAITING狀態(tài),

調(diào)用LockSupport.unpark()方法,可喚醒線程,從WAITING狀態(tài)切換到RUNNING狀態(tài)

3、RUNNING狀態(tài)與TIMED_WAITING狀態(tài)的轉(zhuǎn)換

調(diào)用帶超時(shí)參數(shù)的 Thread..sleep(long millis)方法

獲得 synchronized 隱式鎖的線程,調(diào)用帶超時(shí)參數(shù)的Object.wait(long timeout)方法

調(diào)用帶超時(shí)參數(shù)的Thread.join(long millis)方法

調(diào)用帶超時(shí)參數(shù)的LockSupport.parkNanos(Object blocker,long deadline)方法

調(diào)用帶超時(shí)參數(shù)的LockSupport.parkUntil(long deadline)方法

廢棄掉的線程方法 :stop()、suspend()、resume()

stop()方法,會(huì)真正的殺死線程,不給線程任何喘息的機(jī)會(huì),假設(shè)獲得 synchronized 隱式鎖的線程,此刻執(zhí)行stop()方法,該鎖不會(huì)被釋放,導(dǎo)致其它線程沒有任何機(jī)會(huì)獲得鎖,顯然這樣的結(jié)果不是我們想要見到的。

suspend() resume()方法同樣,因?yàn)槟撤N不可預(yù)料的原因,已經(jīng)被建議不在使用

不能使用stop()、suspend() 、resume() 這些方法來終止線程或者喚醒線程,那么我們應(yīng)該使用什么方法來做呢?答案是:優(yōu)雅的使用Thread.interrupt()方法來做

優(yōu)雅的Thread.interrupt()方法中斷線程

interrupt() 方法僅僅是通知線程,線程有機(jī)會(huì)執(zhí)行一些后續(xù)操作,同時(shí)也可以無視這個(gè)通知,這個(gè)方法通過修改了調(diào)用線程的中斷狀態(tài)來告知那個(gè)線程,說它被中斷了,線程可以通過isInterrupted() 方法,檢測(cè)是不是自己被中斷。

當(dāng)線程被阻塞的時(shí)候,比如被Object.wait, Thread.join和Thread.sleep三種方法之一阻塞時(shí);調(diào)用它的interrput()方法,會(huì)產(chǎn)生InterruptedException異常

擴(kuò)展知識(shí)點(diǎn)
探秘局部變量不會(huì)引發(fā)并發(fā)問題的原因

在Java領(lǐng)域,線程可以擁有自己的操作數(shù)棧,程序計(jì)數(shù)器、局部變量表等資源;我們都知道,多個(gè)線程同時(shí)訪問共享變量的時(shí)候,會(huì)導(dǎo)致數(shù)據(jù)不一致性等并發(fā)問題;但是 Java 方法里面的局部變量是不存在并發(fā)問題的,具體為什么呢?我們先來了解一下這些基礎(chǔ)知識(shí)。

局部變量的作用域是方法內(nèi)部的,當(dāng)方法執(zhí)行完了,局部變量也就銷毀了,也就是說局部變量應(yīng)該是和方法同生共死的。

Java中的方法是如何調(diào)用的?當(dāng)調(diào)用方法時(shí),會(huì)創(chuàng)建新的棧幀,并壓入調(diào)用棧;當(dāng)方法返回時(shí),對(duì)應(yīng)的棧幀就會(huì)被自動(dòng)彈出。也就是說,棧幀和方法是同生共死的。

從上面我們可以得出:方法的調(diào)用就是壓棧和出棧的過程,而在Java中的方法的局部變量又是存儲(chǔ)在棧幀中,所以我們用下面的示意圖幫助大家理解一下

說了那么多,我們還沒有解釋局部變量為啥不會(huì)產(chǎn)生并發(fā)問題,以上,我們知道了,方法的調(diào)用是壓棧和出棧(棧幀)的過程,局部變量又存儲(chǔ)在棧幀中。那么我們的線程和調(diào)用棧又有什么關(guān)系呢,答案是:每個(gè)線程都有自己獨(dú)立的調(diào)用棧

到現(xiàn)在,相信大家都已經(jīng)明白了,局部變量之所以不存在并發(fā)問題,是因?yàn)椋總€(gè)線程都有自己的調(diào)用棧,局部變量都保存在線程各自的調(diào)用棧里面,沒有共享,自然就不存在并發(fā)問題。

歡迎大家關(guān)注公眾號(hào):小白程序之路(whiteontheroad),第一時(shí)間獲取最新信息!!!

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/74013.html

相關(guān)文章

  • [Java并發(fā)-7]java線程小節(jié)

    摘要:在領(lǐng)域,實(shí)現(xiàn)并發(fā)程序的主要手段就是多線程。可運(yùn)行狀態(tài)指的是線程可以分配執(zhí)行。當(dāng)?shù)却氖录霈F(xiàn)了,線程就會(huì)從休眠狀態(tài)轉(zhuǎn)換到可運(yùn)行狀態(tài)。導(dǎo)出線程棧,分析線程狀態(tài)是診斷并發(fā)問題的一個(gè)重要工具。 在 Java 領(lǐng)域,實(shí)現(xiàn)并發(fā)程序的主要手段就是多線程。線程是操作系統(tǒng)里的一個(gè)概念,雖然各種不同的開發(fā)語言如 Java、C# 等都對(duì)其進(jìn)行了封裝,但原理和思路都是相同都。Java 語言里的線程本質(zhì)上就是...

    Sunxb 評(píng)論0 收藏0
  • java線程生命周期線程中斷

    摘要:線程中斷線程中斷就是一種協(xié)作機(jī)制。它并不會(huì)真正的中斷一個(gè)正在運(yùn)行的線程,而只是發(fā)出中斷請(qǐng)求,然后由線程在下一個(gè)合適的時(shí)刻中斷自己。 線程池生命周期包括: RUNNING:接收新的任務(wù)并處理隊(duì)列中的任務(wù) SHUTDOWN:不接收新的任務(wù),但是處理隊(duì)列中的任務(wù) STOP:不接收新的任務(wù),不處理隊(duì)列中的任務(wù),同時(shí)中斷處理中的任務(wù) TIDYING:所有的任務(wù)處理完成,有效的線程數(shù)是0 TER...

    suxier 評(píng)論0 收藏0
  • java并發(fā)編程學(xué)習(xí)之線程生命周期(一)

    摘要:就緒狀態(tài)調(diào)用或者由阻塞狀態(tài)被解除時(shí),進(jìn)入就緒狀態(tài),此時(shí),只能表示線程可以運(yùn)行了,但不代表已經(jīng)運(yùn)行了,需要等待的調(diào)度。死亡狀態(tài)當(dāng)線程執(zhí)行結(jié)束或者異常等,線程就會(huì)結(jié)束,進(jìn)入死亡狀態(tài)。 流程圖 showImg(https://segmentfault.com/img/bVbuJ6f); 新建狀態(tài) 當(dāng)用new創(chuàng)建一個(gè)線程后,線程就處于新建狀態(tài),此時(shí)和其他普通java對(duì)象一樣,由JVM創(chuàng)建內(nèi)存空...

    AndroidTraveler 評(píng)論0 收藏0
  • java并發(fā)編程學(xué)習(xí)之線程生命周期-join(四)

    摘要:定義等待該線程終止,比如線程調(diào)用了線程的,那么線程要等到線程執(zhí)行完后,才可以繼續(xù)執(zhí)行。 定義 等待該線程終止,比如A線程調(diào)用了B線程的join,那么A線程要等到B線程執(zhí)行完后,才可以繼續(xù)執(zhí)行。 示例 public class JoinDemo { static class JoinThread1 implements Runnable { Thread thre...

    xavier 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<