搜尋
首頁Javajava教程Java執行緒的五種狀態及其多執行緒環境下的特徵和表現細說

Java執行緒的五種狀態及其多執行緒環境下的特徵和表現細說

細說Java執行緒的五種狀態及其在多執行緒環境下的特點與表現

Java是一種物件導向的程式語言,其多執行緒的特性使得我們可以同時執行多個任務,提高程式的並發性和反應性。在Java中,執行緒有五種不同的狀態,分別是新建狀態(New)、可運作狀態(Runnable)、阻塞狀態(Blocked)、等待狀態(Waiting)和終止狀態(Terminated)。本文將詳細介紹這五種狀態的特點,並透過具體的程式碼範例展示在多執行緒環境下的表現。

一、新狀態(New)
執行緒被建立出來但還未開始運作的狀態稱為新狀態。在新建狀態下,執行緒的start()方法還未被調用,因此還沒有真正開始執行。此時線程物件已經被創建,但作業系統尚未為其分配執行資源。

二、可運行狀態(Runnable)
執行緒被start()方法呼叫後,進入可運行狀態。處於該狀態的線程正在使用CPU執行其任務,但可能因為其他高優先級的線程,時間片用完或等待輸入/輸出等原因而被掛起。在可運行狀態下,執行緒具有以下特點:

  1. 該狀態下的執行緒是作業系統調度的基本單位。
  2. 多個執行緒並發執行,CPU時間片被指派給各個執行緒以便它們交替執行。
  3. 執行緒的調度是不可控的,因為它是由作業系統決定。

下面是一個簡單的程式碼範例,展示了兩個執行緒的可運行狀態:

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中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?Mar 17, 2025 pm 05:46 PM

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?Mar 17, 2025 pm 05:44 PM

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?Mar 17, 2025 pm 05:43 PM

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Mar 17, 2025 pm 05:35 PM

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器