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

Java 多線程核心:建立、生命週期、調度與同步機制完整指南

     編輯:Java 綜合教學

一、線程的建立方式

1. 繼承 Thread 類別

public class MyThread extends Thread {
    @Override
    public void run() {
        // 線程執行邏輯
    }
}

啟動:new MyThread().start();

2. 實作 Runnable 介面(推薦)

public class MyRunnable implements Runnable {
    @Override
    public void run() {
        // 線程執行邏輯
    }
}

啟動:new Thread(new MyRunnable()).start();

優點:避免單繼承限制,方便共享資源,支援線程池。

二、線程的啟動

  • start():啟動新線程,由 JVM 呼叫 run()。
  • 切勿直接呼叫 run(),否則會在當前線程同步執行,失去多線程意義。

三、線程生命週期(五大狀態)

  1. 新建:new Thread() 後,尚未呼叫 start()。
  2. 就緒:呼叫 start() 後,等待 CPU 排程。
  3. 執行:獲得 CPU,執行 run() 方法。
  4. 阻塞:因 sleep()、wait()、I/O、鎖等待而暫停執行。
  5. 終止:run() 結束或拋出未捕獲異常。

狀態轉換圖:新建 → 就緒 ↔ 執行 → 阻塞 → 就緒 → 執行 → 終止

四、線程調度與控制

1. 優先級

setPriority(int) 範圍 1~10,預設 5。高優先級線程獲得 CPU 機率較大,但非絕對。

2. 睡眠

Thread.sleep(long millis) 讓當前線程放棄 CPU 進入阻塞,指定時間後自動轉就緒。

3. 讓步

Thread.yield() 讓當前線程從執行態回到就緒態,僅讓給同優先級或更高優先級線程。

4. 等待合併

join() 使當前線程等待目標線程終止後再繼續。

Thread t1 = new Thread(() -> { ... });
t1.start();
t1.join(); // 主線程等待 t1 結束

五、線程同步:解決共享資源競爭

當多線程同時讀寫共享變數時,會產生資料不一致。Java 提供 synchronized 關鍵字實現互斥鎖。

問題示範:非同步計數器

class Counter implements Runnable {
    private int count = 0;
    public void run() {
        for (int i = 0; i < 10; i++) {
            count++;
            Thread.yield();
            count--;
            System.out.println(count);
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Counter c = new Counter();
        new Thread(c).start();
        new Thread(c).start();
    }
}
// 輸出結果混亂,出現非零值

解決方案:同步方法

class SafeCounter implements Runnable {
    private int count = 0;
    public synchronized void run() { // 或 synchronized(this) 區塊
        for (int i = 0; i < 10; i++) {
            count++;
            Thread.yield();
            count--;
            System.out.println(count); // 全部輸出 0
        }
    }
}

關鍵點: 同步鎖對象必須是共享資源所屬的實例(或共享的鎖對象),確保同一時間只有一個線程進入臨界區。

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