線程有四種狀態
任何一個線程肯定處於這四種狀態中的一種
) 產生(New)
線程對象已經產生
但尚未被啟動
所以無法執行
如通過new產生了一個線程對象後沒對它調用start()函數之前
) 可執行(Runnable)
每個支持多線程的系統都有一個排程器
排程器會從線程池中選擇一個線程並啟動它
當一個線程處於可執行狀態時
表示它可能正處於線程池中等待排排程器啟動它
也可能它已正在執行
如執行了一個線程對象的start()方法後
線程就處於可執行狀態
但顯而易見的是此時線程不一定正在執行中
) 死亡(Dead)
當一個線程正常結束
它便處於死亡狀態
如一個線程的run()函數執行完畢後線程就進入死亡狀態
) 停滯(Blocked)
當一個線程處於停滯狀態時
系統排程器就會忽略它
不對它進行排程
當處於停滯狀態的線程重新回到可執行狀態時
它有可能重新執行
如通過對一個線程調用wait()函數後
線程就進入停滯狀態
只有當兩次對該線程調用notify或notifyAll後它才能兩次回到可執行狀態
class Object下常用的線程函數
wait()
notify()和notifyAll()這三個函數由java
lang
Object類提供
用於協調多個線程對共享數據的存取
) wait()函數有兩種形式
第一種形式接受一個毫秒值
用於在指定時間長度內暫停線程
使線程進入停滯狀態
第二種形式為不帶參數
代表waite()在notify()或notifyAll()之前會持續停滯
) 當對一個對象執行notify()時
會從線程等待池中移走該任意一個線程
並把它放到鎖標志等待池中
當對一個對象執行notifyAll()時
會從線程等待池中移走所有該對象的所有線程
並把它們放到鎖標志等待池中
) 當調用wait()後
線程會釋放掉它所占有的
鎖標志
從而使線程所在對象中的其它synchronized數據可被別的線程使用
例
下面
我們將對例
中的例子進行修改
class TestThreadMethod extends Thread{
public static int shareVar =
;
public TestThreadMethod(String name){
super(name)
}
public synchronized void run(){
if(shareVar==
){
for(int i=
; i<
; i++){
shareVar++;
if(shareVar==
){
try{
this
wait()
//(
)
}
catch(InterruptedException e){}
}
}
}
if(shareVar!=
){
System
out
print(Thread
currentThread()
getName())
System
out
println(
shareVar =
+ shareVar)
this
notify()
//(
)
}
}
}
public class TestThread{
public static void main(String[] args){
TestThreadMethod t
= new TestThreadMethod(
t
)
TestThreadMethod t
= new TestThreadMethod(
t
)
t
start()
//(
)
//t
start()
(
)
t
start()
//(
)
}}
運行結果為
t
shareVar =
因為t
和t
是兩個不同對象
所以線程t
調用代碼(
)不能喚起線程t
如果去掉代碼(
)的注釋
並注釋掉代碼(
)
結果為
t
shareVar =
t
shareVar =
這是因為
當代碼(
)的線程執行到代碼(
)時
它進入停滯狀態
並釋放對象的鎖狀態
接著
代碼(
)的線程執行run()
由於此時 shareVar值為
所以執行打印語句並調用代碼(
)使代碼(
)的線程進入可執行狀態
然後代碼(
)的線程結束
當代碼(
)的線程重新執行後
它接著執行for()循環一直到shareVar=
然後打印shareVar
From:http://tw.wingwit.com/Article/program/Java/gj/201311/27510.html