傳統單線程程序在 IO 阻塞時 CPU 閒置,效率低下。Java 內建多線程支持,允許單程序並行執行多個任務(如一邊讀取網絡數據,一邊後台計算),大幅提升吞吐與響應。本文面向初學者,系統講解線程創建、優先級、同步控制、線程協作核心知識,並提供完整可運行示例。
class MyThread extends Thread {
@Override public void run() {
System.out.println("Thread running: " + getName());
}
}
// 使用
Thread t = new MyThread();
t.start(); // 必須調用 start() 啟動新線程
class MyTask implements Runnable {
@Override public void run() {
System.out.println("Task running: " + Thread.currentThread().getName());
}
}
// 使用
Thread t = new Thread(new MyTask());
t.start();
核心區別:Runnable 將任務邏輯與線程控制解耦,同一任務實例可提交給多線程/線程池,避免單繼承限制,為企業級開發標準。
關鍵點:start() 異步啟動新線程執行 run();直接調用 run() 只是主線程同步執行,無併發效果。
thread.setPriority(Thread.MAX_PRIORITY)。多線程共享實例/靜態變量時,非原子操作(如 count++、先寫 name 再寫 amount)會導致數據競爭。Java 提供監視器鎖機制:
public synchronized void method()(鎖 this / Class)。synchronized(lockObject) { ... }(顯式鎖,粒度可控)。原理:每個對象關聯一把鎖。線程進入同步區前獲取鎖;鎖被佔用則阻塞等待;退出同步區(正常/異常)自動釋放鎖。
class Warehouse {
private int stock = 0;
final int capacity = 10;
final Object lock = new Object();
// 生產
public void produce() throws InterruptedException {
synchronized(lock) {
while(stock == capacity) lock.wait(); // 滿了等待
stock++;
System.out.println("生產: " + stock);
lock.notifyAll(); // 通知消費者
}
}
// 消費
public void consume() throws InterruptedException {
synchronized(lock) {
while(stock == 0) lock.wait(); // 空了等待
stock--;
System.out.println("消費: " + stock);
lock.notifyAll(); // 通知生產者
}
}
}
synchronized(lock) 持有鎖時調用。while 循環(防虛假喚醒)。wait() 釋放鎖並阻塞;notifyAll() 喚醒所有等待線程(推薦)。lock = new Object() 導致每次鎖不同。修正:final Object lock = new Object();synchronized(this) 但 this 指向不同對象。修正:共享同一 Runnable 實例或傳入共享鎖對象。
public class ProducerConsumerDemo {
public static void main(String[] args) {
Warehouse wh = new Warehouse();
// 生產者線程
new Thread(() -> {
try { while(true) { wh.produce(); Thread.sleep(100); } }
catch (InterruptedException ignored) {}
}, "Producer").start();
// 消費者線程
new Thread(() -> {
try { while(true) { wh.consume(); Thread.sleep(150); } }
catch (InterruptedException ignored) {}
}, "Consumer").start();
}
}
java.util.concurrent 高級組件:ExecutorService、ConcurrentHashMap、BlockingQueue、ReentrantLock、Condition、Semaphore、CountDownLatch、CompletableFuture。掌握線程創建、同步互斥、wait/notify 協作三大基石,是進入 Java 併發編程世界的入場券。