# Thread Introduce ###### tags: `Java` `Thread` What is Thread? > 是作業系統能夠進行運算排程的最小單位。它被包含在process之中,是process中的實際運作單位。一條thread指的是process中一個單一順序的控制流,一個process中可以並行多個thread,每條thread並列執行不同的任務。 by wiki Life Cycle ![](https://i.imgur.com/ALN0IBO.png) 1. NEW : 新建立的Thread Object 。在未執行start()時,就單純是個物件而已 2. RUNNABLE : Thread Object 執行start()後,JVM真正建立了一個執行緒,並且可以被CPU執行 3. RUNNING : 處於此狀態的執行緒為真正在執行code 4. BLOCKED : 執行緒為阻塞的狀態,原因可能會是呼叫了sleep()、wait()、讀寫網路資源、取用了鎖資源。阻塞原因結束後會進入RUNNABLE 5. TERMINATED : 執行緒最終狀態。當線程正常結束、error、JVM Crash會進入指狀態 **Daemon Thread** 特性 : 當建立Daemon Thread的Thread 結束了生命週期時,也會一同結束生命周期 **start()** 呼叫JNI建立執行緒,並且在call obj內的run()執行該Thread Obj 要處理的Task **run()** 直接呼叫等同於一般方法,不會產生新的執行緒 **sleep()** 使執行緒進入BLOCKED,要注意的地方是不會放棄moniter lock 的所有權 **yield()** 使執行緒放棄執行權,進入RUNNABLE Status。但這只是個提示並不代表不會被執行 **Priority** 只有在CPU忙碌時設定才"可能"有效。若大於Thread Group 則以Thread Group 為主 **interrupt()** 使用以下方法可使執行序進入阻塞 Object 的 wati(...) Thread 的sleep(..) Thread 的join(..) .. 而呼叫Thread Obj intertrupt() 則可打斷阻塞,並且被打斷時後拋出一個 InterruptedException 當線程執行了interrupt()時 interrupted flag會被設為true 當線程被可中斷方法阻塞,執行了interrupt()時 interrupted flag會被清除 **isInterrupted()** 返回interrupted flag,不會清除flag **interrupted()** 為靜態方法,判斷執行緒是否被中斷。 並且如果被中斷了第一次會返回true。 會清除調flag。 **join()** 執行緒B join() 執行緒A,則執行緒B會阻塞到執行緒A結束生命周期後才執行 **如何關閉執行緒** 1. 執行緒生命週期結束 2. 捕捉中斷信號 3. 使用volatitle開關控制 **異常** 執行緒在執行中是不允續拋出checked異常(非error or runtime)的 並且起動該執行緒的執行緒也無法直接取得運行中的異常訊息, 因此JAVA提供了一個UncaughtExceptionHandler Interface,當運行中有錯誤時,會呼叫該Interface 在Thread中處理執行時異常的API共有4個 特定執行緒 public void setUncaughtExceptionHandler(..) public ExceptionHandler getUncaughtExceptionHandler() 全域執行緒 public static void setDefaultUncaughtExceptionHandler(..) public ExceptionHandler getDefaultUncaughtExceptionHandler() **** 觀察執行緒工具 : jstack,jconsole、jvisualvm