首頁 >Java >java教程 >Java線程的生命週期的介紹(附範例)

Java線程的生命週期的介紹(附範例)

不言
不言轉載
2019-04-13 10:01:096182瀏覽

這篇文章帶給大家的內容是關於Java線程的生命週期的介紹(附範例),有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。

一、執行緒的生命週期

進程與執行緒一樣,都具有一定的生命週期,執行緒的生命週期包含四個狀態:建立狀態、就緒狀態、阻塞狀態、死亡狀態。

1.創建狀態

1)是指使用new實例化一個線程對象,但該線程對象還未使用start()方法啟動線程這個階段,該階段只在內存的堆中為此物件的實例變數分配了記憶體空間,但執行緒還無法參與搶奪CPU的使用權;

#2)創建完畢線程物件後,啟動該線程物件的是start()方法,而不是run()方法。

2.就緒狀態

1)是指一個執行緒物件使用start()方法後到執行完run()方法的這個階段,執行緒一旦就進入就緒階段,Java虛擬機為此執行緒建立方法的呼叫堆疊和計數器等;

2)在某一單位時間(時間片)內,CPU只能執行一個執行緒,一但一個執行緒擁有了CPU的使用權,則該執行緒也可稱為正在運行狀態;

3)凡是處於就緒狀態的執行緒都被視為活動的,可以使用isAlive()方法測試執行緒是否處於就緒狀態,使用activeCount()來查詢目前執行緒所在執行緒池的活動執行緒數;

4)處於就緒狀態的執行緒並不是運行狀態,在以前的電腦很多都是單處理器的,要在同一時刻運行所有處於就緒狀態的執行緒是不可能的,Java透過一些調度演算法來保證這些執行緒共享使用處理器(如時間片輪轉演算法、獨佔演算法等)。

3.阻塞狀態:

1)阻塞狀態包含四個狀態(睡眠狀態、阻塞狀態、掛起狀態、等待狀態),一般來說,阻塞狀態和就緒狀態可以互相切換的;

2)使用sleep()方法可以執行緒進入睡眠狀態,讓其他行程得到執行機會,但是用sleep方法必須捕捉InterruptedExecption異常;

#3)使用suspend方法可以掛起執行緒(jdk1.2後已過時)、使用wait方法使執行緒進入等待狀態(後面有一個隨筆會專門寫)、使用I/O中斷讓執行緒進入阻塞狀態。

4.死亡狀態:

1)一旦執行緒執行完run方法,執行緒即進入死亡狀態,Java虛擬機會銷毀處於死亡狀態的執行緒物件所佔用的系統資源;

2)執行緒執行時遇到一個未捕獲的異常,執行緒會被終止並進入死亡狀態;呼叫stop方法也可以讓執行緒進入死亡狀態,但是容易造成死鎖,已棄用。

5.執行緒生命週期如下圖:

#二、以下是sleep方法讓執行緒進入睡眠狀態的案例

/**
 * @author: PrincessHug
 * @date: 2019/4/12, 9:20
 * @Blog: https://www.cnblogs.com/HelloBigTable/
 */
public class SleepDemo  implements Runnable{
    @Override
    public void run() {
        long l;
        for (int i=1;i<6;i++){
            l = System.currentTimeMillis();
            try {
                Thread.currentThread().sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            l = (System.currentTimeMillis() - l);
            System.out.println(Thread.currentThread().getName() + "线程执行了" + i + "次,耗时" + l + "毫秒。");
        }
    }
}
public class SleepDriver {
    public static void main(String[] args) {
        SleepDemo sd = new SleepDemo();
        for (int i=0;i<50;i++){
            new Thread(sd,i + "#").start();
        }
    }
}

下面是部分運行結果截圖:

可以看到如果同時啟動的執行緒越多,會導致每個執行緒的耗時越長。

以上是Java線程的生命週期的介紹(附範例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除