看別人寫的部落格,看jdk自己重複寫了一次分析,顯淺易懂的,至少比jdk的解析易懂得多。
至於線程啟動並執行狀態圖,網上大把大把的,自行google之。
具體的分析直接看代碼的注釋即可。。。。。
同時顯淺地說明了yeild和join的理解
感覺那個中文jdk api參考手冊就是機器翻譯的
/** * 線程的狀態分析 * @author aa * */public class ThreadState { public static void main(String[] args) throws Exception { /** * 建立線程,線程為建立狀態 * jdk:至今尚未啟動的線程的狀態。 * 如果不給線程設定名稱,線程的名稱將會是:Thread-0,Thread-1。。。。。 */ ThreadDemo td = new ThreadDemo() ; System.out.println("建立狀態:" + td.getState()) ; // 建立狀態:NEW /** * 可運行狀態:當線程有資格運行,調用start方法,線程首先進入可運行狀態, * 可運行狀態,不一定被線程發送器運行, * 簡單來說,調用start方法後,該線程依然是可運行狀態,但未運行, * 存放在可運行池中, * 線程在啟動並執行過程中,該線程的狀態也是可運行狀態 * * djk:可運行線程的線程狀態。處於可運行狀態的某一線程正在 JAVA 虛擬機器中運行, * 但它可能正在等待作業系統中的其他資源,比如處理器。 */ td.start() ; System.out.println("可運行狀態:" + td.getState()) ; // 可運行狀態:RUNNABLE /** * Main線程休眠100毫秒時,td線程也就調用了waitForTwoSecond()方法, * 指定休眠2秒後,再回到可運行狀態 * 指定等待一定時間長度時,休眠狀態:TIMED_WAITING * jdk:具有指定等待時間的某一等待線程的線程狀態。某一線程因為調用以下帶有指定正等待時間的方法之一而處於定時等待狀態: * 帶有逾時值的 Thread.sleep (sleep必須帶值) * 帶有逾時值的 Object.wait * 帶有逾時值的 Thread.join */ Thread.sleep(100); System.out.println("休眠狀態:" + td.getState()) ; // 具有指定等待時間的某一等待線程的線程狀態。 /** * 這裡Main線程一共休眠2100毫秒時,td線程調用了waitLong()方法, * 該方法調用了wait(),使線程處於一直等待的狀態 * jdk:某一等待線程的線程狀態。某一線程因為調用下列方法之一而處於等待狀態: * 不帶逾時值的 Object.wait * 不帶逾時值的 Thread.join */ Thread.sleep(2000); System.out.println("等待狀態:" + td.getState()) ; // 等待狀態:WAITING td.interrupt() ; /** * 這裡輸出的也可能是終止狀態 * jdk:受阻塞並且正在等待監視器鎖的某一線程的線程狀態。處於受阻塞狀態的某一線程正在等待監視器鎖, * 以便進入一個同步的塊/方法,或者在調用 Object.wait 之後再次進入同步的塊/方法。 */ td.notifyWait() ; System.out.println("阻塞狀態:" + td.getState()) ; /** * jdk:已終止線程的線程狀態。線程已經結束執行。 */ Thread.sleep(1000); System.out.println("終止狀態:" + td.getState()) ; /** * 可以簡單歸納為:建立 , 可運行 , 運行 , 阻塞 , 死亡 * * Thread.yeild() 讓當前啟動並執行線程回到可運行狀態,讓出時間給其他線程運行,但可能沒用 * jdk:暫停當前正在執行的線程對象,並執行其他線程。 */ /** * join()的用法 * jdk:等待該線程終止的時間最長為 millis 毫秒。逾時為 0 意味著要一直等下去。 * 簡單來說,如下,由於td線程被Main線程所啟動,td線程調用join方法後, * 也就是Mian線程要等到td線程運行完畢才會執行join方法後面的代碼, * jdk的解析在這裡就是將Main線程加入到了td線程的後面 * join加參數,在這裡意思就是Main線程需要等待2秒時間再繼續執行join方法後面的代碼, */// td.join() ;// td.join(2000) ; System.out.println("線程加入join之後") ; } private static class ThreadDemo extends Thread { @Override public void run() { try { // 測試join方法// for (int i = 0; i < 5; i++) {// System.out.println(i);// sleep(1000) ;// } waitForTwoSecond() ; waitLong() ; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public synchronized void waitForTwoSecond() throws Exception { wait(2000) ; } public synchronized void waitLong() throws Exception { wait() ; } public synchronized void notifyWait() throws Exception { notify() ; } }}
有錯歡迎指正。。。。。。。。。