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

Java 線程基礎核心總結:進程 vs 線程、四大狀態、創建啟動與常見誤區

     編輯:Java 綜合教學

線程是 Java 並發編程的最小調度單元。本文系統梳理進程與線程區別、線程四大生命週期狀態、兩種創建方式、啟動與運行機制、以及新手高頻誤區,打牢並發基石。

進程 vs 線程

維度進程線程
定義執行中的程序,資源分配基本單位進程內的執行路徑,CPU 調度基本單位
內存獨立地址空間(代碼、數據、堆、棧)共享進程堆/方法區,私有棧、程序計數器
創建/切換開銷大(分配 PCB、頁表、內存映射)小(僅棧、寄存器、上下文)
通信IPC(管道、Socket、共享內存、消息隊列)共享內存直接讀寫、volatile、鎖、隊列
穩定性崩潰不影響其他進程一線程崩潰可導致整進程退出

線程因輕量、共享內存,被稱為「輕量級進程」。

線程四大狀態(JVM 視角)

  1. 新建:new Thread(),僅分配 Java 對象內存,未請求 OS 線程資源。
  2. 可運行:調用 start(),向 OS 申請線程,進入就緒隊列,等待 CPU 時間片。(含 Running)
  3. 阻塞/等待:
    • sleep()、wait()、join() 主動放棄 CPU。
    • I/O 等待、鎖等待(synchronized/Lock)。
    • suspend()(已棄用)。
  4. 死亡:
    • 正常:run() 執行完返回。
    • 異常:未捕獲異常拋出。
    • 強制:stop()(已棄用,極不安全)。

棧結構

兩種創建啟動方式

1. 繼承 Thread

class MyThread extends Thread {
    public void run() { System.out.println("Thread 運行"); }
}
new MyThread().start(); // 必須 start(),直接 run() 只是普通方法調用

2. 實現 Runnable(推薦)

class MyTask implements Runnable {
    public void run() { System.out.println("Runnable 運行"); }
}
new Thread(new MyTask()).start(); // 同一 Task 可被多線程共享,解耦任務與執行

對比

  • Runnable 支持同一任務多線程並發、避免單繼承限制、便於線程池提交。
  • Java 8+ 推薦 Runnable + Lambda:new Thread(() -> {...}).start();

常見誤區與正確認知

線程內存模型速覽

  • 每線程私有:程序計數器(字節碼行號)、虛擬機棧(棧幀:局部變量表、操作數棧、動態鏈接、返回地址)、本地方法棧。
  • 線程共享:堆(對象實例、數組)、方法區(類信息、常量、靜態變量、JIT 編譯代碼)、直接內存(NIO Buffer)。

下一步學習路徑

  1. 線程同步機制:synchronized、Lock、volatile、ThreadLocal。
  2. 線程協作:wait/notify、Condition、CountDownLatch、CyclicBarrier、Semaphore。
  3. 線程池:ExecutorService、ThreadPoolExecutor、CompletableFuture。
  4. JUC 並發容器:ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue。
  5. JMM 內存模型:happens-before、指令重排、volatile 語義、final 語義。

夯實線程基礎,並發編程不再是「玄學」,而是可推演、可控制的工程科學。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
誤區正確認知
直接調用 run() 即啟動線程必須調用 start() 請求 OS 創建線程,run() 只是主線程同步執行
sleep() 釋放鎖sleep() 不釋放任何鎖;wait() 釋放監視器鎖
stop() 安全終止線程stop() 強制釋放鎖導致數據不一致,嚴禁使用;用 interrupt() + 標誌位
線程優先級決定執行順序優先級僅影響獲取 CPU 概率,不保證順序
共享變量無需同步多線程讀寫共享變量必須同步(synchronized/volatile/原子類/鎖)
start() 可重複調用線程啟動後不可再次 start(),會拋 IllegalThreadStateException