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

Java 多線程編程核心機制全解析:從線程生命週期到同步實戰

     編輯:Java 程式設計入門

核心概念辨析

  • 程序:靜態代碼集合 (如 .class 文件)。
  • 進程:程序的一次動態執行過程,擁有獨立內存空間,是資源分配基本單位。
  • 線程:進程內的執行單元,共享進程內存,是 CPU 調度基本單位。一個進程可包含多個線程。

比喻:QQ 客戶端 = 程序;登錄一個 QQ = 進程;發送消息 = 線程。

線程生命週期五大狀態

  1. 新建 (NEW):Thread 實例創建,分配內存資源,未調用 start()。
  2. 就緒 (RUNNABLE):調用 start() 進入線程隊列,等待 CPU 時間片。
  3. 運行 (RUNNING):獲取 CPU,執行 run() 方法邏輯。
  4. 阻塞 (BLOCKED/WAITING/TIMED_WAITING):因同步鎖、I/O、sleep、wait 等暫停執行,釋放 CPU。
  5. 死亡 (TERMINATED):run() 正常結束或異常終止,不可復活。

狀態轉換觸發條件:start()→就緒;調度器選中→運行;sleep/wait/同步鎖→阻塞;阻塞原因消失→就緒;run() 結束/stop()→死亡。

線程優先級與調度

  • 三級優先級:MIN_PRIORITY(1)、NORM_PRIORITY(5)、MAX_PRIORITY(10),主線程默認 NORM_PRIORITY。
  • 可通過 setPriority(int) 修改,但僅為提示,不保證調度順序,受 OS 調度器影響大。

創建線程兩大途徑

方式一:繼承 Thread 類

class MyThread extends Thread {
    @Override
    public void run() { /* 任務邏輯 */ }
}
// 使用
new MyThread().start();

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

class MyTask implements Runnable {
    @Override
    public void run() { /* 任務邏輯 */ }
}
// 使用
new Thread(new MyTask()).start();

優勢:避免單繼承限制,任務與線程控制解耦,便於線程池提交。

常用 Thread 方法

  • start():啟動線程 (異步),切勿直接調用 run()。
  • sleep(long ms):當前線程休眠,不釋放鎖。
  • yield():讓出 CPU,重新進入就緒隊列。
  • join():等待該線程終止。
  • isAlive():判斷線程是否存活。
  • interrupt():中斷阻塞/休眠線程。

線程同步核心機制

synchronized 關鍵字

  • 同步方法:public synchronized void method(),鎖對象為 this (實例方法) 或 Class 對象 (靜態方法)。
  • 同步塊:synchronized(lockObj) { ... },精確控制鎖範圍與粒度。

經典案例:會計與出納共享賬本

class Account {
    private int balance = 100;
    public synchronized void deposit(int amt) { balance += amt; }
    public synchronized void withdraw(int amt) { balance -= amt; }
}

同一時刻只有一個線程能執行同步方法,保證餘額一致性。

同步陷阱與優化

  1. 避免在同步塊中執行耗時操作 (I/O、網絡調用)。
  2. 優先使用私有最終鎖對象:private final Object lock = new Object();
  3. 考慮 Lock 介面 (ReentrantLock) 實現公平鎖、可中斷鎖、超時等待等高級特性。
  4. 使用 ThreadLocal、不可變對象、並發集合 (ConcurrentHashMap) 降低同步需求。

總結

掌握線程生命週期、創建方式、同步機制是 Java 併發編程基石。實戰中應結合業務場景選擇合適同步策略,善用高級併發工具包 (java.util.concurrent) 提升性能與可維護性。

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