線程的狀态有: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