---
# System prepended metadata

title: Thread Introduce
tags: [Thread, Java]

---

# 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