執行緒有五個狀態,分別是新建(new)、就緒(runnable)、執行(running)、阻塞(blocked)和死亡(dead)。
程式使用new會新建乙個執行緒,new出的物件跟普通物件一樣,jvm會為其分配記憶體,初始化成員變數等,此時執行緒並沒有執行,而是就是新建狀態。
當執行緒物件呼叫start後,執行緒將進入就緒狀態。jvm會為其建立函式排程棧和計數器,但此時執行緒依然沒有執行,而是等待獲取cpu執行片
下面的例子可以證明當執行緒物件呼叫start後,並不一定立即執行,
1
2
3
4
5
6
7
for
(
int
i=
0
; i<
50
; i++)
}
上面是在main中建立子執行緒,下面是執行結果,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
...
main
18
main
19
main
20
main
21
main
22
new
thread
1
0
main
23
new
thread
1
1
main
24
new
thread
1
2
main
25
...
從上面的執行結果可以看到,原本在main中i=20的時候新建了乙個子執行緒,並立即呼叫了start()使執行緒進入就緒狀態,但是一直等到i=22的時候,子執行緒才開始執行,所以子執行緒何時會開始執行取決於cpu執行片的分配,由jvm排程器決定。
當就緒狀態的執行緒獲取了cpu執行片的之後,就進入執行狀態,但是在執行過程中,可能會因為以下原因使執行緒進入阻塞狀態,
執行緒從執行進入阻塞狀態之後,接著只能繼續阻塞或者再次進入就緒狀態,下面情況會使執行緒由阻塞狀態重新進入就緒狀態,
下圖演示了執行緒狀態轉換過程,
注意從上圖可知,
執行緒從阻塞狀態只能進入就緒狀態,
通常情況下,就緒狀態和執行狀態的轉換是不受程式控制的,而是由jvm執行緒排程機制控制的
yield()方法可以讓執行狀態的執行緒進入就緒狀態
執行緒結束後就處於死亡狀態,執行緒會以如下三種方式結束,
注意,子執行緒一旦啟動,其地位和主線程是一樣的,所以一旦主線程結束了,子執行緒不會受影響,不會跟著結束
執行緒物件的isalive()方法在就緒,執行,阻塞時返回true,在新建,死亡時返回false
對已經死亡的執行緒呼叫start()是無效的,會丟擲異常。 死亡的執行緒不可再次作為執行緒來執行。
對於新建的執行緒,呼叫兩次start()方法也會丟擲異常
java基礎之多執行緒的基礎基礎知識
程序是程式的一次執行過程,是系統執行程式的基本單位,因此程序是動態的。系統執行乙個程式即是乙個程序從建立,執行到消亡的過程。如下圖所示,在 windows 中通過檢視任務管理器的方式,我們就可以清楚看到 window 當前執行的程序 exe檔案的執行 執行緒與程序相似,但執行緒是乙個比程序更小的執行...
Java多執行緒基礎知識
一 執行緒執行狀態 1.執行緒執行狀態圖 執行緒共包括以下5種狀態。1.新建狀態 new 執行緒物件被建立後,就進入了新建狀態。例如,thread thread new thread 2.就緒狀態 runnable 也被稱為 可執行狀態 執行緒物件被建立後,其它執行緒呼叫了該物件的start 方法,...
Java基礎之多執行緒
實現介面runnable 實現介面callable 結合執行緒池 實現callable介面或者runnable介面 呼叫如下方法即可 結束任務 執行緒池方式 初始化執行緒池 executorservice pool executors.newfixedthreadpool 2 可以執行runnabl...