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

Java 多線程程序設計入門:從線程創建到同步控制的完整實戰教程

     編輯:Java 相關知識

傳統單線程程序在 IO 阻塞時 CPU 閒置,效率低下。Java 內建多線程支持,允許單程序並行執行多個任務(如一邊讀取網絡數據,一邊後台計算),大幅提升吞吐與響應。本文面向初學者,系統講解線程創建、優先級、同步控制、線程協作核心知識,並提供完整可運行示例。

一、線程創建的兩種標準方式

1. 繼承 Thread 類


class MyThread extends Thread {
    @Override public void run() {
        System.out.println("Thread running: " + getName());
    }
}
// 使用
Thread t = new MyThread();
t.start(); // 必須調用 start() 啟動新線程

2. 實現 Runnable 接口(推薦)


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() 只是主線程同步執行,無併發效果。

二、線程優先級:調度提示而非強制命令

  • 範圍 1 (MIN_PRIORITY) ~ 10 (MAX_PRIORITY),默認 5 (NORM_PRIORITY)。
  • 設置:thread.setPriority(Thread.MAX_PRIORITY)。
  • 注意:優先級只是對線程調度器的提示,不保證執行順序,不同 JVM/OS 實現差異極大,不可依賴優先級實現業務邏輯正確性。

三、線程同步:保護共享數據的核心機制

多線程共享實例/靜態變量時,非原子操作(如 count++、先寫 name 再寫 amount)會導致數據競爭。Java 提供監視器鎖機制:

1. synchronized 關鍵字

  • 同步方法:public synchronized void method()(鎖 this / Class)。
  • 同步塊:synchronized(lockObject) { ... }(顯式鎖,粒度可控)。

原理:每個對象關聯一把鎖。線程進入同步區前獲取鎖;鎖被佔用則阻塞等待;退出同步區(正常/異常)自動釋放鎖。

2. 經典案例:生產者-消費者(倉庫模型)


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(); // 通知生產者
        }
    }
}

3. wait/notify 協作鐵律

  • 必須在 synchronized(lock) 持有鎖時調用。
  • 條件判斷用 while 循環(防虛假喚醒)。
  • wait() 釋放鎖並阻塞;notifyAll() 喚醒所有等待線程(推薦)。

四、同步失效常見陷阱

  1. 鎖對象不穩定:同步塊中 lock = new Object() 導致每次鎖不同。修正:final Object lock = new Object();
  2. 不同實例同步:多線程各自 synchronized(this) 但 this 指向不同對象。修正:共享同一 Runnable 實例或傳入共享鎖對象。
  3. 同步 run() 方法:導致多線程串行化。禁止。

五、完整可運行示例:生產消費模擬


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 內存模型 (JMM):happens-before、volatile、final 語義。
  • java.util.concurrent 高級組件:ExecutorService、ConcurrentHashMap、BlockingQueue、ReentrantLock、Condition、Semaphore、CountDownLatch、CompletableFuture。
  • 線程池設計原理與調優實戰。
  • 併發設計模式:Immutable、Thread-Local、Guarded Suspension、Balking、Read-Write Lock 等。
  • 經典著作:《Java Concurrency in Practice》(Java 併發編程實戰)。

掌握線程創建、同步互斥、wait/notify 協作三大基石,是進入 Java 併發編程世界的入場券。

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