細說Java執行緒的五種狀態及其在多執行緒環境下的特點與表現
Java是一種物件導向的程式語言,其多執行緒的特性使得我們可以同時執行多個任務,提高程式的並發性和反應性。在Java中,執行緒有五種不同的狀態,分別是新建狀態(New)、可運作狀態(Runnable)、阻塞狀態(Blocked)、等待狀態(Waiting)和終止狀態(Terminated)。本文將詳細介紹這五種狀態的特點,並透過具體的程式碼範例展示在多執行緒環境下的表現。
一、新狀態(New)
執行緒被建立出來但還未開始運作的狀態稱為新狀態。在新建狀態下,執行緒的start()方法還未被調用,因此還沒有真正開始執行。此時線程物件已經被創建,但作業系統尚未為其分配執行資源。
二、可運行狀態(Runnable)
執行緒被start()方法呼叫後,進入可運行狀態。處於該狀態的線程正在使用CPU執行其任務,但可能因為其他高優先級的線程,時間片用完或等待輸入/輸出等原因而被掛起。在可運行狀態下,執行緒具有以下特點:
下面是一個簡單的程式碼範例,展示了兩個執行緒的可運行狀態:
class MyRunnable implements Runnable{ public void run(){ for(int i=0; i<10; i++){ System.out.println(Thread.currentThread().getName() + ": " + i); } } } public class Main { public static void main(String[] args) { Thread t1 = new Thread(new MyRunnable()); Thread t2 = new Thread(new MyRunnable()); t1.start(); t2.start(); } }
在上面的範例中,我們建立了兩個執行緒t1和t2,並同時啟動它們。由於兩個執行緒並發運行,因此它們的輸出將交替出現。
三、阻塞狀態(Blocked)
執行緒進入阻塞狀態是因為它無法取得某些資源,或等待某些條件來滿足。處於阻塞狀態下的執行緒不會消耗CPU時間,直到取得資源或條件滿足後進入可運行狀態。
下面是一個簡單的程式碼範例,展示了一個執行緒的阻塞狀態:
public class Main { public static void main(String[] args) { Object lock = new Object(); Thread t1 = new Thread(() -> { synchronized (lock) { try { System.out.println("Thread 1 is waiting"); lock.wait(); System.out.println("Thread 1 is running again"); } catch (InterruptedException e) { e.printStackTrace(); } } }); Thread t2 = new Thread(() -> { try { Thread.sleep(2000); synchronized (lock) { System.out.println("Thread 2 is waking up Thread 1"); lock.notify(); } } catch (InterruptedException e) { e.printStackTrace(); } }); t1.start(); t2.start(); } }
在上面的範例中,我們建立了兩個執行緒t1和t2,t1在執行過程中透過呼叫wait()方法進入等待狀態,直到t2透過notify()方法喚醒它。這裡t1處於阻塞狀態的原因是它無法繼續執行,直到t2發出通知。當t2發出通知後,t1解除阻塞並重新進入可運作狀態。
四、等待狀態(Waiting)
執行緒進入等待狀態是因為它需要等待其他執行緒做出一些特定的動作。處於等待狀態的執行緒會一直等待,直到它被通知或中斷。
下面是一個簡單的程式碼範例,展示了一個執行緒的等待狀態:
public class Main { public static void main(String[] args) { Object lock = new Object(); Thread t1 = new Thread(() -> { synchronized (lock) { System.out.println("Thread 1 is waiting"); try { lock.wait(); // 进入等待状态 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread 1 is running again"); } }); Thread t2 = new Thread(() -> { try { Thread.sleep(2000); synchronized (lock) { System.out.println("Thread 2 is waking up Thread 1"); lock.notify(); // 唤醒等待的线程 } } catch (InterruptedException e) { e.printStackTrace(); } }); t1.start(); t2.start(); } }
在上面的範例中,我們透過lock.wait()方法使t1執行緒進入等待狀態,直到t2執行緒透過lock.notify()方法來通知它。
五、終止狀態(Terminated)
執行緒執行完其任務或因異常退出時,進入終止狀態。處於終止狀態的執行緒不再執行,無法再次啟動。
下面是一個簡單的程式碼範例,展示了一個執行緒的終止狀態:
public class Main { public static void main(String[] args) { Thread t1 = new Thread(() -> { for(int i=0; i<10; i++){ System.out.println(Thread.currentThread().getName() + ": " + i); } }); t1.start(); try { t1.join(); // 确保线程执行完 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Thread 1 is terminated"); } }
在上面的範例中,我們建立了一個執行緒t1並啟動它。然後透過t1.join()方法來確保執行緒執行完後再繼續執行後續程式碼。
綜上所述,本文介紹了Java執行緒的五種狀態及其在多執行緒環境下的特點與表現。對於多執行緒程式設計來說,了解執行緒狀態的轉換和特點是至關重要的,使用合適的執行緒狀態可以使程式更有效率和可靠。希望透過本文的介紹,讀者能更能理解Java執行緒的工作機制,並在實際專案中正確使用多執行緒程式設計。
以上是Java執行緒的五種狀態及其多執行緒環境下的特徵和表現細說的詳細內容。更多資訊請關注PHP中文網其他相關文章!