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

Java 線程詳解:核心概念、創建方式、生命周期與進程對比

     編輯:Java 相關知識

進程與線程:核心區別

維度進程線程
定義程序的一次執行,擁有獨立內存空間進程內的執行路徑,共享進程內存
資源開銷大(獨立地址空間、文件句柄等)小(僅棧、程序計數器、寄存器)
通信方式IPC(管道、Socket、共享內存等)共享內存、同步鎖、volatile 等
切換開銷高(上下文切換涉及 MMU 刷新)低(僅寄存器/棧切換)
穩定性進程崩潰不影響其他進程線程崩潰導致整個進程退出

Java 線程模型

  • 每次執行 java 命令啟動一個 JVM 進程
  • JVM 啟動創建 主線程,從 main() 開始執行
  • 每個線程擁有 私有棧,存儲局部變量、方法調用幀 → 局部變量線程安全
  • 實例變量、類變量存儲在堆/方法區 → 非線程安全

線程三大狀態轉換

┌─────────┐     start()      ┌─────────┐
│  NEW    │ ──────────────→  │ RUNNABLE│
└─────────┘                  └────┬────┘
                                   │ get CPU
                                   ▼
                            ┌─────────────┐
                            │  RUNNING    │
                            └──────┬──────┘
                                   │
              ┌────────────────────┼────────────────────┐
              │                    │                    │
       sleep/wait/join        I/O block          yield
              │                    │                    │
              ▼                    ▼                    ▼
       ┌───────────┐        ┌───────────┐        ┌───────────┐
       │  BLOCKED  │        │  WAITING  │        │ RUNNABLE  │
       └───────────┘        └───────────┘        └───────────┘
              │                    │                    │
              └────────────────────┴────────────────────┘
                                   │
                              run() ends
                                   ▼
                            ┌─────────┐
                            │ TERMINATED│
                            └─────────┘

兩種標準創建方式

1. 實現 Runnable 接口(推薦)

public class Task implements Runnable {
    @Override
    public void run() {
        System.out.println("執行線程: " + Thread.currentThread().getName());
    }
}

// 使用
Runnable task = new Task();
new Thread(task, "Thread-A").start();
new Thread(task, "Thread-B").start(); // 同一任務實例可被多線程共享

優勢:避免單繼承限制、任務與線程分離、支持線程池提交、可共享任務實例。

2. 繼承 Thread 類

public class MyThread extends Thread {
    @Override
    public void run() {
        System.out.println("執行線程: " + getName());
    }
}

// 使用
new MyThread().start(); // 必須調用 start() 而非 run()

劣勢:繼承 Thread 佔用了繼承名額,任務與線程耦合。

匿名內部類 / Lambda 寫法(實戰常用)

// Runnable + Lambda
new Thread(() -> {
    System.out.println("Lambda 線程: " + Thread.currentThread().getName());
}, "Lambda-Thread").start();

// 線程池提交(生產環境推薦)
ExecutorService executor = Executors.newFixedThreadPool(4);
executor.submit(() -> System.out.println("線程池任務"));
executor.shutdown();

常見誤區澄清

  • 調用 run() 而非 start():直接調用 run() 只是普通方法調用,不會創建新線程,仍在主線程執行
  • 單 CPU 多線程不一定提速:上下文切換開銷可能超過收益,IO 密集型受益明顯,CPU 密集型需謹慎
  • 主線程結束不代表程序結束:若有非守護線程存活,JVM 不會退出

總結

Java 多線程核心在於 Runnable 任務封裝 + Thread 執行載體 + 線程池管理。理解進程/線程區別、狀態流轉、創建方式優劣,是編寫高併發、高性能 Java 應用的基石。生產環境務必使用線程池(ThreadPoolExecutor)統一管理線程生命周期,避免頻繁創建銷毀開銷與 OOM 風險。

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