Java線程通信可通過(guò)1.wait/notify機(jī)制;2.volatile關(guān)鍵字;3.concurrent工具類實(shí)現(xiàn)。wait()使線程等待并釋放鎖,notify()/notifyall()喚醒線程,需配合synchronized使用且用while判斷條件。volatile確保變量可見(jiàn)性,適合讀多寫少場(chǎng)景。java.util.concurrent提供countdownlatch、cyclicbarrier等高級(jí)工具,適用于復(fù)雜協(xié)調(diào)場(chǎng)景,封裝底層邏輯更安全簡(jiǎn)潔。
在Java中,線程之間的通信是一個(gè)很常見(jiàn)的需求。比如一個(gè)線程需要等待另一個(gè)線程完成某個(gè)操作后才能繼續(xù)執(zhí)行,或者多個(gè)線程之間需要共享數(shù)據(jù)并協(xié)調(diào)狀態(tài)。實(shí)現(xiàn)線程間通信的方式有多種,各有適用場(chǎng)景和優(yōu)缺點(diǎn)。
使用 wait()、notify() 和 notifyAll()
這三個(gè)方法是 Java 中最基本的線程通信機(jī)制,它們都定義在 Object 類中,必須在同步塊(synchronized block)中使用。
- wait():讓當(dāng)前線程進(jìn)入等待狀態(tài),并釋放持有的鎖。
- notify():?jiǎn)拘岩粋€(gè)正在等待的線程。
- notifyAll():?jiǎn)拘阉姓诘却木€程。
常見(jiàn)用法: 通常用于生產(chǎn)者-消費(fèi)者模型中。例如:
synchronized (lock) { while (conditionNotMet) { lock.wait(); } // 執(zhí)行操作 lock.notifyAll(); }
注意點(diǎn):
立即學(xué)習(xí)“Java免費(fèi)學(xué)習(xí)筆記(深入)”;
- 必須配合 synchronized 使用,否則會(huì)拋出異常。
- 推薦使用 while 循環(huán)檢查條件,而不是 if,防止虛假喚醒。
使用 volatile 關(guān)鍵字
volatile 是一種輕量級(jí)的線程同步方式,適用于變量狀態(tài)變化被其他線程立即感知的情況。
典型應(yīng)用場(chǎng)景: 比如一個(gè)線程監(jiān)聽(tīng)標(biāo)志位來(lái)決定是否停止運(yùn)行:
private volatile boolean running = true; public void run() { while (running) { // 做一些任務(wù) } } public void stop() { running = false; }
特點(diǎn):
- 保證變量的可見(jiàn)性,不保證原子性。
- 不會(huì)造成線程阻塞,適合讀多寫少的場(chǎng)景。
使用 java.util.concurrent 包中的工具類
從 Java 5 開(kāi)始,java.util.concurrent 包提供了更高級(jí)的并發(fā)工具,簡(jiǎn)化了線程間的協(xié)作。
常見(jiàn)類包括:
- CountDownLatch:允許一個(gè)或多個(gè)線程等待其他線程完成操作。
- CyclicBarrier:多個(gè)線程互相等待,到達(dá)屏障點(diǎn)后再一起繼續(xù)執(zhí)行。
- Exchanger:兩個(gè)線程之間交換數(shù)據(jù)。
- 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("所有任務(wù)完成");
這些類封裝了底層的 wait/notify 邏輯,使用起來(lái)更安全、簡(jiǎn)潔。
基本上就這些實(shí)現(xiàn)線程通信的常用方法了。不同場(chǎng)景下可以選擇不同的方式,比如簡(jiǎn)單的狀態(tài)同步可以用 volatile,復(fù)雜協(xié)調(diào)則推薦 java.util.concurrent 工具類。