首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 多執行緒核心功力:從基礎概念到執行緒池實戰

     編輯:Java 綜合教學

Java 多執行緒核心功力:從基礎概念到執行緒池實戰

一、作業系統層面的進程與執行緒

  • 進程:記憶體中執行的應用程式,擁有獨立記憶體空間(如 Windows 的 .exe)
  • 執行緒:進程內的執行流程,共享進程記憶體,屬於某個進程
  • 「同時」執行是人類感覺,實際為 CPU 時間片輪換

二、Java 執行緒實現兩大方式

1. 繼承 Thread 類別

public class TestThread extends Thread {
    public TestThread(String name) { super(name); }
    @Override public void run() {
        for (int i = 0; i < 5; i++) {
            for (long k = 0; k < 100000000; k++);
            System.out.println(getName() + " :" + i);
        }
    }
    public static void main(String[] args) {
        new TestThread("阿三").start();
        new TestThread("李四").start();
    }
}

2. 實作 Runnable 介面(推薦)

public class DoSomething implements Runnable {
    private String name;
    public DoSomething(String name) { this.name = name; }
    @Override public void run() {
        for (int i = 0; i < 5; i++) {
            for (long k = 0; k < 100000000; k++);
            System.out.println(name + ": " + i);
        }
    }
}
public class TestRunnable {
    public static void main(String[] args) {
        new Thread(new DoSomething("阿三")).start();
        new Thread(new DoSomething("李四")).start();
    }
}

Runnable 方式解耦任務與執行緒控制,支援多執行緒共享同一任務實例。

三、執行緒啟動與常見誤區

  • start():啟動新執行緒,建立新呼叫棧,執行 run()
  • 直接呼叫 run():不會建立新執行緒,單純方法呼叫
  • 執行緒名稱:主執行緒固定為 main,子執行緒預設 Thread-0、Thread-1...
  • 取得目前執行緒:Thread.currentThread()
  • 執行順序無保障:啟動順序 ≠ 執行順序,調度由 JVM 決定
  • 執行緒不可重複啟動:已終止的執行緒呼叫 start() 拋出 IllegalThreadStateException

四、執行緒棧模型與狀態轉換

執行緒棧變化示意圖

呼叫 t.start() 時,程式分支出新呼叫棧 B,棧 A、B 並行執行。方法調用與執行緒啟動的本質區別在於是否建立新棧。

五大狀態

執行緒狀態轉換圖

  1. 新建:建立 Thread 物件,未呼叫 start()
  2. 可執行:呼叫 start() 後,等待 CPU 調度
  3. 執行中:獲得 CPU 時間片,執行 run()
  4. 等待/阻塞/睡眠:活著但暫無執行條件(sleep()、wait()、I/O 等待、鎖等待)
  5. 死亡:run() 結束或異常終止,不可復生

五、執行緒調度與控制方法

1. sleep() - 靜態方法

try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); }
  • 強制目前執行緒睡眠指定毫秒數
  • 醒來進入可執行狀態,不保證立即執行
  • 最佳實踐:讓出 CPU 給其他執行緒

2. yield() - 讓步

  • 目前執行緒回到可執行狀態,讓同優先級執行緒有機會執行
  • 無保證:可能被調度器立即再次選中
  • 不會進入等待/阻塞狀態

3. join() - 等待終止

Thread t = new MyThread();
t.start();
// 主執行緒等待 t 結束
t.join();           // 無限等待
t.join(5000);       // 最多等待 5 秒
  • 有保證:當前執行緒阻塞直到目標執行緒終止
  • 若目標執行緒已死亡,立即返回

join() 導致的執行緒棧變化

4. 優先級

  • 範圍 1~10,預設 5(Thread.NORM_PRIORITY)
  • 子執行緒繼承父執行緒優先級
  • 不可依賴優先級控制邏輯:JVM 可能將多個優先級映射為同一原生優先級

六、離開執行狀態的完整總結

  1. Thread.sleep() - 睡眠指定時間
  2. Thread.yield() - 讓步(無保證)
  3. join() - 等待其他執行緒終止(有保證)
  4. run() 正常結束
  5. 呼叫物件的 wait()(非執行緒方法)
  6. 無法獲得物件鎖(進入同步區塊前)
  7. 調度器主動剝奪 CPU(時間片輪換)

七、執行緒池實戰應用

參考文章 168771《Java 執行緒池應用》,核心要點:

  • Executors.newFixedThreadPool(n):固定大小,無界隊列
  • Executors.newCachedThreadPool():動態伸縮,SynchronousQueue
  • Executors.newSingleThreadExecutor():單執行緒循序執行
  • Executors.newScheduledThreadPool(n):定時/週期任務
  • shutdown() vs shutdownNow():優雅關閉 vs 強制中斷
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved