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

並發程式設計入門:進程、執行緒與 Java 多執行緒核心機制

     編輯:Java 程式設計入門

並發 vs 並行:核心概念辨析

維度並發並行
定義同一時間段內處理多個任務,單核透過時間片切換同一時刻物理上同時執行多個任務,需多核心
本質邏輯上的同時發生物理上的同時發生
目的提高單核 CPU 利用率提高多核吞吐量
類比單廚師輪流做多道菜多廚師同時做菜

Java 多執行緒模型優勢

  • Java 原生支援多執行緒,語言層面提供 Thread、Runnable、同步機制
  • Servlet 容器天生多執行緒(每請求一執行緒)
  • Swing/SWT 事件分發執行緒(EDT)保證 UI 操作執行緒安全
  • 掌握並發是高效開發分散式系統、Web 應用、高效能服務的前提

進程與執行緒深度對比

進程特徵

  • 獨立地址空間,擁有獨立 PCB(進程控制塊)
  • 進程間通訊(IPC)複雜:管道、Socket、共享記憶體、訊號
  • 建立/切換開銷大(需切換頁表、刷新 TLB、保存/恢復寄存器)
  • 穩定性高:單一進程崩潰不影響其他進程

執行緒特徵

  • 共享進程地址空間、堆記憶體、檔案描述符
  • 擁有獨立棧、程式計數器、區域變數
  • 建立/切換開銷小(只需保存/恢復棧指針、寄存器)
  • 通訊便捷:直接讀寫共享記憶體(需同步機制保護)
  • 風險:單一執行緒錯誤可能導致整個進程崩潰

Java 執行緒建立與啟動完整指南

方式一:繼承 Thread 類別

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

// 使用
MyThread thread = new MyThread();
thread.start(); // 必須呼叫 start(),而非 run()

方式二:實現 Runnable 介面(推薦)

public class Task implements Runnable {
    private final int taskId;
    
    public Task(int id) { this.taskId = id; }
    
    @Override
    public void run() {
        System.out.println("任務 " + taskId + " 執行於 " + Thread.currentThread().getName());
    }
}

// 使用
Thread thread = new Thread(new Task(1));
thread.start();

Runnable vs Thread 設計哲學

  • Runnable = 任務:封裝業務邏輯,可被多種執行器執行(Thread、執行緒池、CompletableFuture)
  • Thread = 執行器:負責排程、生命週期管理、上下文切換
  • 分離任務與執行策略,符合單一職責原則,支援靈活的執行緒池複用

執行緒生命週期與狀態轉換

NEW → RUNNABLE → RUNNING → BLOCKED/WAITING/TIMED_WAITING → TERMINATED
  • NEW:建立 Thread 物件,未呼叫 start()
  • RUNNABLE:呼叫 start() 後,等待 CPU 排程
  • RUNNING:獲得 CPU 時間片,正在執行
  • BLOCKED:等待監視器鎖(synchronized)
  • WAITING:無限期等待(wait()、join())
  • TIMED_WAITING:限時等待(sleep()、wait(timeout))
  • TERMINATED:run() 正常結束或拋出未捕獲異常

常見誤區與最佳實踐

誤區正確做法
直接呼叫 run() 方法必須呼叫 start() 啟動新執行緒
使用 stop()/suspend()/resume()已棄用,使用 volatile 標誌位或 interrupt() 協作式終止
忽略異常處理導致執行緒靜默死亡在 run() 中捕獲異常,記錄日誌,必要時重啟任務
過度建立執行緒導致 OOM使用執行緒池控制併發數量

Thread.yield() 與 線程調度

  • yield():提示調度器當前執行緒願意讓出 CPU,但不保證立即切換
  • Java 執行緒調度為搶佔式優先級調度:高優先級執行緒獲得更多 CPU 時間
  • 優先級範圍 1-10(MIN_PRIORITY=1, NORM_PRIORITY=5, MAX_PRIORITY=10)
  • 優先級僅是提示,不保證執行順序,跨平台行為可能不同

總結

理解進程與執行緒的區別、掌握 Java 多執行緒建立方式、生命週期管理、同步機制,是並發程式設計的基石。後續將深入探討執行緒同步、鎖機制、並發容器、執行緒池、JUC 組件等進階主題。

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