Java多線程Thread基礎知識總結
什么是線程
大家都很熟悉操作系統中的多任務:在同一刻運行多個程序的能力。
多線程程序在較低的層次上擴展了多任務的概念:一個程序同時執行多個任務。通常,每一個任務稱為一個線程,它是線程控制的簡稱。可以同時運行一個以上線程的程序稱為多線程程序。
多進程和多線程的區別:
它們本質的區別在于每個進程擁有自己的一整套變量,而線程共享數據。
在一個單獨的線程中執行一個任務的簡單過程:
- 將任務代碼移到實現了Runnable接口的類的run方法中。
public interface Runnable { public abstract void run(); }
實現一個類:
public class MyRunnable implements Runnable { @Override public void run() { // TODO Auto-generated method stub task code } }
- 創建一個類對象:
Runnable r = new MyRunnable();
- 由Runnable創建一個Thread對象:
Thread t = new Thread(r);
- 啟動線程:
t.start();
注意:
不要調用Thread類或Runnable對象run方法。直接調用run方法,只會執行同一個線程中的任務,而不會啟動新線程。應該調用Thread.start方法。
中斷線程
interrupt方法可以用來請求終止線程。當對一個線程調用interrupt方法時,線程的中斷狀態將被重置。這是每個線程都具有的boolean標志。每個線程都應該不是的檢查這個值,以判斷線程是否被中斷。
要想檢查線程的中斷狀態,首先調用Thread.currentThread方法獲得當前線程,然后調用isInterrupted方法:
while (!Thread.currentThread().isInterrupted()) { work code }
但是,如果線程被阻塞,就無法檢測中斷狀態。當在一個被阻塞的線程(調用sleep或wait)上調用interrupt方法時,就是報InterruptedException異常。
interrupted和isInterrupted的區別
Interrupted方法是一個靜態方法,它檢測當前的線程是否被中斷。而且,調用interrupted方法會清除該線程的中斷狀態。另一方面,isInterrupted方法是一個實例方法,可用來檢驗是否有線程被中斷。調用這個方法不會改變中斷狀態。
InterruptedException異常處理
- 在catch子句中調用Thread.currentThread().interrupt()來設置中斷狀態,讓調用者可以對它進行檢查。
void mySubTask() { // ... try { sleep(delay); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } // ... }
- 或者,更好的方式是用throws InterruptedException,不采用try catch 語句捕獲異常。讓調用者捕獲異常。
void mySubTask() throws InterruptedException{ // ... sleep(delay); // ... }
線程狀態
線程可以有6中狀態:(獲取當前狀態,可調用getState方法)
- New (新創建)
- Runnable(可運行)
- Blocked (被阻塞)
- Waiting (等待)
- Timed waiting (計時等待)
- Terminated (被終止)
新創建線程
當用new創建一個新線程是,如 new Thread(r),該線程還沒有開始運行。這意味著它的狀態是new。當一個線程處于新創建狀態時,程序還沒有開始運行線程中的代碼。
可運行線程
一旦調用start方法,線程處于runnable狀態。一旦線程開始運行,它不必始終保持運行。事實上,運行中的線程被中斷,目的是為了讓其他線程獲得運行機會。在任何時候,一個可運行的線程可能正在運行也可能沒有運行,所以說這個狀態被稱作可運行而不是運行。
被阻塞線程和等待線程
當線程處于被阻塞或等待狀態時,它暫時不活動,它不運行代碼并且只消耗最少的資源,直到線程調度器重新激活它。
- 當一個線程試圖獲取一個內部的對象鎖,而該鎖被其他線程持有,則該線程進入阻塞狀態。
- 當線程等待另一個線程通知調度器一個條件時,它自己進入等待狀態。(如Thread.join 或 Object.wait)
-
有幾個方法有一個超時參數,調用它們會導致線程進入計時等待狀態。(如Thread.sleep,Thread.join,和 Object.wait 等)
被終止的線程
- 因為run方法執行完畢,正常退出而自然死亡。
- 或者因為一個沒有捕獲的異常終止了run方法,意外死亡。
來自: http://blog.csdn.net/qq710262350/article/details/43024955