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

資訊專欄INFORMATION COLUMN

Java線程的生命周期

ivyzhang / 2860人閱讀

摘要:線程的生命周期線程的生命周期大致可以分為下面五種狀態新建狀態就緒狀態運行狀態休眠狀態終止狀態新建狀態,是線程被創建且未啟動的狀態這里的創建,僅僅是在的這種編程語言層面被創建,而在操作系統層面,真正的線程還沒有被創建。

概要

目前CPU的運算速度已經達到了百億次每秒,甚至更高的量級,家用電腦即使維持操作系統正常運行的進程也會有數十個,線程更是數以百計。

線程是CPU的調度和分派的基本單位,為了更充分地利用CPU資源以及提高生產率和高效地完成任務,在現實場景中一般都會采用多線程處理。

線程的生命周期

線程的生命周期大致可以分為下面五種狀態:New(新建狀態)、RUNABLE(就緒狀態)、RUNNING(運行狀態)、休眠狀態DEAD(終止狀態)

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

Thread t1 = new Thread()

2、就緒狀態,指的是調用start()方法之后,線程等待分配給CPU執行(這時候,線程已經在操作系統層面被創建)

t1.start()

3、運行狀態,當CPU空閑時,線程被分得CPU時間片,執行Run()方法的狀態

4、休眠狀態,運行狀態的線程,如果調用一個阻塞的API或者等待某個事件,那么線程的狀態就會轉換到休眠狀態,一般有以下幾種情況

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

主動阻塞:調用Thread的某些方法,主動讓出CPU執行權,比如:sleep()、join()等方法

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

5、終止狀態,線程執行完(run()方法執行結束)或者出現異常就會進入終止狀態

對應的是JAVA中Thread類State中的六種狀態

public class Thread implements Runnable {
   //.........
    
    public enum State {
        NEW, // 初始化狀態
      
        RUNNABLE, // 可運行/運行狀態
      
        BLOCKED, // 阻塞狀態
        
        WAITING, // 無時限等待
       
        TIMED_WAITING, // 有時限等待
  
        TERMINATED; // 終止狀態
    }
   
    // ..........
}
休眠狀態(BLOCKEDWAITINGTIMED_WAITING)與RUNNING狀態的轉換

1、RUNNING狀態與BLOCKED狀態的轉換

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

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

2、RUNNING狀態與WAITING狀態的轉換

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

調用無參數Thread.join()方法

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

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

3、RUNNING狀態與TIMED_WAITING狀態的轉換

調用帶超時參數的 Thread..sleep(long millis)方法

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

調用帶超時參數的Thread.join(long millis)方法

調用帶超時參數的LockSupport.parkNanos(Object blocker,long deadline)方法

調用帶超時參數的LockSupport.parkUntil(long deadline)方法

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

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

suspend() resume()方法同樣,因為某種不可預料的原因,已經被建議不在使用

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

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

interrupt() 方法僅僅是通知線程,線程有機會執行一些后續操作,同時也可以無視這個通知,這個方法通過修改了調用線程的中斷狀態來告知那個線程,說它被中斷了,線程可以通過isInterrupted() 方法,檢測是不是自己被中斷。

當線程被阻塞的時候,比如被Object.wait, Thread.join和Thread.sleep三種方法之一阻塞時;調用它的interrput()方法,會產生InterruptedException異常

擴展知識點
探秘局部變量不會引發并發問題的原因

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

局部變量的作用域是方法內部的,當方法執行完了,局部變量也就銷毀了,也就是說局部變量應該是和方法同生共死的。

Java中的方法是如何調用的?當調用方法時,會創建新的棧幀,并壓入調用棧;當方法返回時,對應的棧幀就會被自動彈出。也就是說,棧幀和方法是同生共死的。

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

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

到現在,相信大家都已經明白了,局部變量之所以不存在并發問題,是因為,每個線程都有自己的調用棧,局部變量都保存在線程各自的調用棧里面,沒有共享,自然就不存在并發問題。

歡迎大家關注公眾號:小白程序之路(whiteontheroad),第一時間獲取最新信息!!!

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/74013.html

相關文章

  • [Java并發-7]java線程小節

    摘要:在領域,實現并發程序的主要手段就是多線程。可運行狀態指的是線程可以分配執行。當等待的事件出現了,線程就會從休眠狀態轉換到可運行狀態。導出線程棧,分析線程狀態是診斷并發問題的一個重要工具。 在 Java 領域,實現并發程序的主要手段就是多線程。線程是操作系統里的一個概念,雖然各種不同的開發語言如 Java、C# 等都對其進行了封裝,但原理和思路都是相同都。Java 語言里的線程本質上就是...

    Sunxb 評論0 收藏0
  • java線程生命周期線程中斷

    摘要:線程中斷線程中斷就是一種協作機制。它并不會真正的中斷一個正在運行的線程,而只是發出中斷請求,然后由線程在下一個合適的時刻中斷自己。 線程池生命周期包括: RUNNING:接收新的任務并處理隊列中的任務 SHUTDOWN:不接收新的任務,但是處理隊列中的任務 STOP:不接收新的任務,不處理隊列中的任務,同時中斷處理中的任務 TIDYING:所有的任務處理完成,有效的線程數是0 TER...

    suxier 評論0 收藏0
  • java并發編程學習之線程生命周期(一)

    摘要:就緒狀態調用或者由阻塞狀態被解除時,進入就緒狀態,此時,只能表示線程可以運行了,但不代表已經運行了,需要等待的調度。死亡狀態當線程執行結束或者異常等,線程就會結束,進入死亡狀態。 流程圖 showImg(https://segmentfault.com/img/bVbuJ6f); 新建狀態 當用new創建一個線程后,線程就處于新建狀態,此時和其他普通java對象一樣,由JVM創建內存空...

    AndroidTraveler 評論0 收藏0
  • java并發編程學習之線程生命周期-join(四)

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

    xavier 評論0 收藏0

發表評論

0條評論

ivyzhang

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<