Java線程通信可通過1.wait/notify機制;2.volatile關鍵字;3.concurrent工具類實現。wait()使線程等待并釋放鎖,notify()/notifyall()喚醒線程,需配合synchronized使用且用while判斷條件。volatile確保變量可見性,適合讀多寫少場景。java.util.concurrent提供countdownlatch、cyclicbarrier等高級工具,適用于復雜協調場景,封裝底層邏輯更安全簡潔。
在Java中,線程之間的通信是一個很常見的需求。比如一個線程需要等待另一個線程完成某個操作后才能繼續執行,或者多個線程之間需要共享數據并協調狀態。實現線程間通信的方式有多種,各有適用場景和優缺點。
使用 wait()、notify() 和 notifyAll()
這三個方法是 Java 中最基本的線程通信機制,它們都定義在 Object 類中,必須在同步塊(synchronized block)中使用。
- wait():讓當前線程進入等待狀態,并釋放持有的鎖。
- notify():喚醒一個正在等待的線程。
- notifyAll():喚醒所有正在等待的線程。
常見用法: 通常用于生產者-消費者模型中。例如:
synchronized (lock) { while (conditionNotMet) { lock.wait(); } // 執行操作 lock.notifyAll(); }
注意點:
立即學習“Java免費學習筆記(深入)”;
- 必須配合 synchronized 使用,否則會拋出異常。
- 推薦使用 while 循環檢查條件,而不是 if,防止虛假喚醒。
使用 volatile 關鍵字
volatile 是一種輕量級的線程同步方式,適用于變量狀態變化被其他線程立即感知的情況。
典型應用場景: 比如一個線程監聽標志位來決定是否停止運行:
private volatile boolean running = true; public void run() { while (running) { // 做一些任務 } } public void stop() { running = false; }
特點:
- 保證變量的可見性,不保證原子性。
- 不會造成線程阻塞,適合讀多寫少的場景。
使用 java.util.concurrent 包中的工具類
從 Java 5 開始,java.util.concurrent 包提供了更高級的并發工具,簡化了線程間的協作。
常見類包括:
- CountDownLatch:允許一個或多個線程等待其他線程完成操作。
- CyclicBarrier:多個線程互相等待,到達屏障點后再一起繼續執行。
- Exchanger:兩個線程之間交換數據。
- Phaser:比 CyclicBarrier 更靈活的階段性同步工具。
以 CountDownLatch 為例:
CountDownLatch latch = new CountDownLatch(3); for (int i = 0; i < 3; i++) { new Thread(() -> { // 做事情 latch.countDown(); }).start(); } latch.await(); // 等待所有線程完成 System.out.println("所有任務完成");
這些類封裝了底層的 wait/notify 邏輯,使用起來更安全、簡潔。
基本上就這些實現線程通信的常用方法了。不同場景下可以選擇不同的方式,比如簡單的狀態同步可以用 volatile,復雜協調則推薦 java.util.concurrent 工具類。