天天看點

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont

線程的狀态有:new、runnable、running、waiting、timed_waiting、blocked、dead 

當執行new Thread(Runnabler)後,新建立出來的線程處于new狀态,這種線程不可能執行 

當執行thread.start()後,線程處于runnable狀态,這種情況下隻要得到CPU,就可以開始執行了。runnable狀态的線程,會接受JVM的排程,進入running狀态,但是具體何時會進入這個狀态,是随機不可知的 

running狀态中的線程最為複雜,可能會進入runnable、waiting、timed_waiting、blocked、dead狀态: 

如果CPU排程給了别的線程,或者執行了Thread.yield()方法,則進入runnable狀态,但是也有可能立刻又進入running狀态 

如果執行了Thread.sleep(long),或者thread.join(long),或者在鎖對象上調用object.wait(long)方法,則會進入timed_waiting狀态 

如果執行了thread.join(),或者在鎖對象上調用了object.wait()方法,則會進入waiting狀态 

如果進入了同步方法或者同步代碼塊,沒有擷取鎖對象的話,則會進入blocked狀态 

處于waiting狀态中的線程,如果是因為thread.join()方法進入等待的話,在目标thread執行完畢之後,會回到runnable狀态;如果是因為object.wait()方法進入等待的話,在鎖對象執行object.notify()或者object.notifyAll()之後會回到runnable狀态 

處于timed_waiting狀态中的線程,和waiting狀态中的差不多,隻不過是設定時間到了,就會回到runnable狀态 

處于blocked狀态中的線程,隻有擷取了鎖之後,才會脫離阻塞狀态 

當線程執行完畢,或者抛出了未捕獲的異常之後,會進入dead狀态,該線程結束

參考的資源:

http://go-on.iteye.com/blog/1673894

http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html