1. 程式人生 > >Java執行緒學習和總結(執行緒的概念)

Java執行緒學習和總結(執行緒的概念)

執行緒的概念:

多執行緒允許在程式中併發執行多個指令流,每個指令流都稱為一個執行緒,彼此間互相獨立。它和程序一樣擁有獨立的執行控制,由作業系統負責排程,區別在於執行緒沒有獨立的儲存空間,而是和所屬程序中的其它執行緒共享一個儲存空間,這使得執行緒間的通訊遠較程序簡單。
具體到java記憶體模型,由於Java被設計為跨平臺的語言,在記憶體管理上,顯然也要有一個統一的模型。系統存在一個主記憶體(Main Memory), Java中所有變數都儲存在主存中,對於所有執行緒都是共享的。每條執行緒都有自己的工作記憶體(Working Memory),工作記憶體中儲存的是主存中某些變數的拷貝,執行緒對所有變數的操作都是在工作記憶體中進行,執行緒之間無法相互直接訪問,變數傳遞均需要通過主存完成。
多個執行緒的執行是併發的,也就是在邏輯上“同時”,而不管是否是物理上的“同時”。如果系統只有一個CPU,那麼真正的“同時”是不可能的。“同時”執行是人的感覺,線上程之間實際上輪換執行。多執行緒和傳統的單執行緒在程式設計上最大的區別在於,由於各個執行緒的控制流彼此獨立,使得各個執行緒之間的程式碼是亂序執行的,將會帶來執行緒排程,同步等問題。

JAVA實現多執行緒

執行緒總體分兩類:使用者執行緒和守候執行緒。
當所有使用者執行緒執行完畢的時候,JVM自動關閉。但是守候執行緒卻不獨立於JVM,守候執行緒一般是由作業系統或者使用者自己建立的。

JAVA實現多執行緒主要有兩種方法:實現java.lang.Runnable介面、繼承java.lang.Thread類。

方法一:繼承 Thread 類,重寫方法 run(),我們在建立的 Thread 類的子類中重寫 run() ,加入執行緒所要執行的程式碼即可。由於類的繼承只有一個,所以當前類已經繼承其他類的情況下就不能再繼承Thread類。

方法二:實現 Runnable 介面。Runnable 介面只有一個方法 run(),我們宣告自己的類實現 Runnable 介面並提供這一方法,將我們的執行緒程式碼寫入其中,就完成了這一部分的任務。但是 Runnable 介面並沒有任何對執行緒的支援,我們還必須建立 Thread 類的例項,這一點通過 Thread 類的建構函式public Thread(Runnable target);來實現。


執行緒的四種狀態 1.新狀態:執行緒已被建立但尚未執行(start() 尚未被呼叫)。 2.可執行狀態:執行緒可以執行,雖然不一定正在執行。CPU 時間隨時可能被分配給該執行緒,從而使得它執行。 3.阻塞狀態:執行緒不會被分配 CPU 時間,無法執行;可能阻塞於I/O,或者阻塞於同步鎖。 4.死亡狀態:正常情況下run() 返回使得執行緒死亡。呼叫 stop()或 destroy() 亦有同樣效果,但是不被推薦,前者會產生異常,後者是強制終止,不會釋放鎖。 執行緒的優先順序
執行緒的優先順序代表該執行緒的重要程度,當有多個執行緒同時處於可執行狀態並等待獲得 CPU 時間時,執行緒排程系統根據各個執行緒的優先順序來決定給誰分配 CPU 時間,優先順序高的執行緒有更大的機會獲得 CPU 時間,優先順序低的執行緒也不是沒有機會,只是機會要小一些罷了。 你可以呼叫 Thread 類的方法 getPriority() 和 setPriority()來存取執行緒的優先順序,執行緒的優先順序界於1(MIN_PRIORITY)和10(MAX_PRIORITY)之間,預設是5(NORM_PRIORITY)。
執行緒狀態變遷圖: