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

Java Thread 多線程詳解與用法解析

     編輯:Java 相關知識

前言

多線程是 Java 並發編程基石。本文系統涵蓋線程建立、生命週期、常用方法、阻塞與控制、守護線程、優先級、讓步、同步機制、線程通訊與生產者消費者模式。

一、建立線程的兩種方式

// 1. 繼承 Thread
class MyThread extends Thread {
    @Override public void run() { /* 執行邏輯 */ }
}
new MyThread().start();

// 2. 實作 Runnable(推薦,支援 Lambda)
Runnable task = () -> { /* 執行邏輯 */ };
new Thread(task).start();

區別:Runnable 解耦任務與執行機制,方便提交至線程池;Thread 適合簡單繼承場景。

二、線程生命週期

六大狀態:NEW → RUNNABLE → BLOCKED/WAITING/TIMED_WAITING → TERMINATED。

  • start():進入 RUNNABLE,等待 CPU 調度。
  • sleep(ms):TIMED_WAITING,不釋放鎖。
  • wait():WAITING,釋放鎖,需 notify() 喚醒。
  • join():等待目標線程終止。
  • yield():主動讓出 CPU,回 RUNNABLE。
  • interrupt():中斷標記,配合 isInterrupted() 實現優雅停止。

三、常用控制方法

方法說明靜態/實例
sleep(long ms)當前線程休眠靜態
yield()讓出 CPU靜態
join()等待該線程結束實例
setDaemon(true)設為守護線程(需在 start 前)實例
setPriority(int)設優先級 1-10(MAX=10, NORM=5, MIN=1)實例
interrupt()發出中斷信號實例

四、同步與鎖

1. synchronized

// 同步方法
public synchronized void add() { count++; }
// 同步區塊(推薦細粒度)
public void add() { synchronized(lock) { count++; } }

2. Lock 介面

Lock lock = new ReentrantLock();
lock.lock(); try { /* critical section */ } finally { lock.unlock(); }

Lock 支援可中斷鎖、超時鎖、公平鎖、條件變數(Condition),功能更強大。

五、線程通訊:wait/notify/Condition

// Object 監視器
synchronized(obj) {
    while (conditionNotMet) obj.wait();
    // 執行任務
    obj.notifyAll();
}

// Lock Condition(更靈活,支援多條件隊列)
Condition notFull = lock.newCondition();
Condition notEmpty = lock.newCondition();
lock.lock();
try {
    while (queue.size() == capacity) notFull.await();
    queue.add(item);
    notEmpty.signal();
} finally { lock.unlock(); }

六、生產者-消費者完整範例

class Buffer {
    private final Queue<Integer> queue = new LinkedList<>();
    private final int capacity = 10;
    private final Lock lock = new ReentrantLock();
    private final Condition notFull = lock.newCondition(), notEmpty = lock.newCondition();

    public void produce(int value) throws InterruptedException {
        lock.lock();
        try {
            while (queue.size() == capacity) notFull.await();
            queue.offer(value);
            notEmpty.signal();
        } finally { lock.unlock(); }
    }
    public int consume() throws InterruptedException {
        lock.lock();
        try {
            while (queue.isEmpty()) notEmpty.await();
            int val = queue.poll();
            notFull.signal();
            return val;
        } finally { lock.unlock(); }
    }
}

七、守護線程與優先級注意事項

  • 守護線程(GC、JIT 編譯器)在所有用戶線程結束後自動終止。
  • 優先級僅是提示,不保證執行順序;跨平台行為差異大,不建議依賴。
  • 優雅停止:使用 volatile boolean running 標誌 + interrupt() 打斷阻塞。

八、總結

掌握線程生命週期、同步工具(synchronized/Lock)、通訊機制(wait/notify/Condition)是並發編程核心。實務中優先使用高層抽象(ExecutorService、CompletableFuture、BlockingQueue、並發集合)降低複雜度與 Bug 風險。

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