首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Java 線程核心知識體系:從基礎概念到 Thread/Runnable 實現全圖解

     編輯:PHP 相關知識

什麼是線程?

線程是進程中的一個實體,是系統獨立調度和分派的基本單位。線程自身不擁有系統資源,僅擁有運行必需的資源(程序計數器、棧、局部變量),但可與同進程的其他線程**共享進程的所有資源**(堆內存、文件句柄、全局變量等)。

線程 vs 進程

維度進程線程
資源擁有獨立地址空間、獨立資源共享進程資源,僅有私有棧/PC
調度單位否(作為容器)是(CPU 調度基本單位)
創建/銷毀開銷大(需分配地址空間、載入資源)小(輕量級進程)
通信方式IPC(管道、Socket、共享內存)直接讀寫共享變量(需同步)
穩定性崩潰不影響其他進程一線程崩潰可能導致整進程退出

線程生命週期(五態模型)

  1. 新建:new Thread(),未調用 start()。
  2. 就緒:調用 start() 後,等待 CPU 調度。
  3. 運行:獲得 CPU 時間片,執行 run() 方法體。
  4. 阻塞:等待 I/O、鎖、睡眠(sleep())、wait()、join()。
  5. 死亡:run() 正常返回、拋出未捕獲異常、調用 stop()(已棄用)。

狀態轉換:新建 → 就緒 ↔ 運行 → 死亡;運行 → 阻塞 → 就緒。

線程調度與優先級

  • Java 採用搶佔式調度:優先級高的線程獲得更多 CPU 時間片。
  • 優先級常量:MIN_PRIORITY=1、NORM_PRIORITY=5、MAX_PRIORITY=10。
  • setPriority() / getPriority() 設置獲取,**但不可依賴優先級實現業務邏輯正確性**(不同 JVM/OS 實現差異大)。

線程組

  • 將多線程歸組管理,可批量操作(如 interrupt()、setDaemon()、enumerate())。
  • 線程創建時必須指定組,默認繼承父線程所在組;一旦加入不可移出。

守護線程

  • 為其他線程提供後台服務(如 GC、JIT 編譯、Netty EventLoop)。
  • 當所有非守護線程結束,JVM 自動退出,守護線程不阻止 JVM 關閉。
  • setDaemon(true) 必須在 start() 前調用;isDaemon() 判斷。

實現線程的兩種標準方式

方式一:繼承 Thread 類

class MyThread extends Thread {
  @Override
  public void run() {
    // 線程執行體
    for (int i = 0; i < 5; i++) {
      System.out.println(Thread.currentThread().getName() + " - " + i);
    }
  }
  public static void main(String[] args) {
    new MyThread().start(); // 必須調用 start(),而非 run()
  }
}

方式二:實現 Runnable 接口(推薦)

class MyTask implements Runnable {
  @Override
  public void run() {
    // 線程執行體
  }
  public static void main(String[] args) {
    Thread t = new Thread(new MyTask());
    t.start();
  }
}

為什麼推薦 Runnable?

  1. 避免單繼承限制:Java 單繼承,繼承 Thread 就無法繼承業務基類。
  2. 職責分離:任務邏輯與線程控制解耦,同一任務可提交給多線程/線程池/定時器。
  3. 便於併發工具使用:ExecutorService.submit(Runnable)、FutureTask、CompletableFuture 皆接受 Runnable/Callable。

Thread 核心方法速查

方法說明狀態影響
start()啟動線程,JVM 調用 run()新建 → 就緒
run()線程執行體,**直接調用不會開新線程**—
sleep(ms)靜態方法,讓當前線程睡眠,**不釋放鎖**運行 → 阻塞
yield()讓出 CPU,重新參與調度,**不保證成功**運行 → 就緒
join()等待該線程結束調用者阻塞
interrupt()打斷阻塞/睡眠,設置中斷標誌拋出 InterruptedException
stop()/suspend()/resume()已棄用,不安全,易導致數據不一致—
isAlive()判斷線程是否存活(已啟動未死亡)—

現代併發最佳實踐(Java 5+)

  • 不再手動管理 Thread,**使用線程池** Executors / ThreadPoolExecutor。
  • 優先用 Callable + Future 獲取返回值,或 CompletableFuture 異步編排。
  • 同步工具:ReentrantLock、CountDownLatch、CyclicBarrier、Semaphore、Phaser。
  • 線程安全集合:ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue 實現類。
  • 避免 volatile 濫用,理解 happens-before 規則。

總結

線程是 Java 併發的基石。掌握「生命週期、調度、同步、協作」四大核心,拋棄 Thread 繼承轉向 Runnable + 線程池,再配合 JUC 包豐富工具,才能寫出高效、安全、可維護的併發程序。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved