執行緒從建立到執行到結束是乙個執行緒的生命週期,當執行緒被建立到結束過程中,不是一直處於執行狀態的,下面來介紹一下執行緒從執行到結束所有的狀態.
執行緒狀態
導致狀態發生條件
new(新建)
執行緒剛被建立,沒有啟動,也就是還沒呼叫start()方法.mythread t = new mythread只有執行緒物件,沒有執行緒特徵。
runnable(可執行)
這個時候執行緒已經呼叫了start方法,進入可執行狀態
blocked(鎖阻塞)
當乙個執行緒想要獲取乙個物件鎖,而該物件鎖被其他執行緒持有,該執行緒就進入了鎖阻塞狀態,當該執行緒得到鎖物件時,就變成了runnable(可執行)狀態.
waiting(無限等待)
乙個執行緒等待另乙個執行緒被notify(喚醒)的動作時,該執行緒進入無限等待狀態,這個狀態是不自動喚醒的,只有等待另乙個執行緒被notify之後才能夠被喚醒.
timed waiting(計時等待)
sleep設定的時間超時了,wait時間超時搶到了鎖物件或中途被notify之後搶到了鎖物件,在這個過程中,是計時等待狀態
teminated(被終止)
有三種情況:呼叫了stop方法、正常退出run方法正常死亡、出現了異常沒有捕獲到
接下來看一下詳細**:
或者,wait(time)中途被notify(喚醒),需要重新獲取鎖物件,如果搶到鎖了,會繼續執行,如果沒有搶到鎖,該執行緒會進入鎖阻塞的狀態.
wait與notify
兩個都是object類中的方法,這兩個方法必須在同乙個鎖物件中,
wari一旦進入無限等待狀態,會釋放鎖,往後背notify喚醒之後,也需要重新搶鎖,搶到了,繼續執行,搶不到,鎖阻塞.
**notify:**喚醒一條等待的執行緒,如果有多個執行緒需要被喚醒,notify會在其中隨機喚醒乙個.
public
class
mythread
catch
(interruptedexception e)
}//新增元素
list.
add(
"張三");
system.out.
println
(list)
;//喚醒取資料的執行緒
list.
notify()
;}}}
}).start()
;//建立取資料的執行緒
newthread
(new
runnable()
catch
(interruptedexception e)
}//獲取元素
list.
remove(0
);system.out.
println
(list)
;//喚醒存資料的執行緒
list.
notify()
;}}}
}).start();}}
需求:
請用「等待喚醒」機制編寫乙個程式,要求:第乙個執行緒:遍歷1–1000所有的數字,在遍歷過程中,如果發現這個數字能 同時被2,3,5,7整除,立即wait()退出等待,讓第二個執行緒進入。
第二個執行緒:執行後,將乙個計數器 + 1,之後再喚醒等待的執行緒。
主線程中:休息2秒,讓兩個執行緒全部執行完畢,列印「計數器」的結果。
public
class
test
catch
(interruptedexception e)
system.out.
println
("計數器結果是:"
+thread2.count);}
}class
lock
class
thread1
extends
thread
@override
public
void
run(
)catch
(interruptedexception e)
}//喚醒另外乙個執行緒
lock.
notify()
;}}}
}class
thread2
extends
thread
public
int count =0;
@override
public
void
run(
)try
catch
(interruptedexception e)}}
}}
JAVA多執行緒的六種狀態例項
多執行緒六種狀態例項,最下方圖是執行 流程,希望對你有幫助!多執行緒的六種狀態 public class threadstatustest catch interruptedexception e 同步鎖 synchronized obj catch interruptedexception e s...
Thread的六種狀態
執行緒共有6種狀態 在某一時刻只能是這6種狀態之一。這些狀態由thread.state這個列舉型別表示,並且可以通過getstate 方法獲得當前具體的狀態型別。包括 new,runnable,blocked,waiting,timed waiting,terminatmed new至今尚未啟動的執...
Bundle的狀態有六種
installed resolved starting active stopping uninstalled 注意 1 即使bundle已經停止,其export的package仍然是可以使用的,這也就意味著可以執行resolved狀態的bundle中export package的類。2 bundl...