如何在Java中實(shí)現(xiàn)線程間的通信,有哪些方法?

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中實(shí)現(xià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)。

如何在Java中實(shí)現(xiàn)線程間的通信,有哪些方法?

使用 wait()、notify() 和 notifyAll()

這三個(gè)方法是 Java 中最基本的線程通信機(jī)制,它們都定義在 Object 類中,必須在同步塊(synchronized block)中使用。

如何在Java中實(shí)現(xiàn)線程間的通信,有哪些方法?

  • 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í)筆記(深入)”;

如何在Java中實(shí)現(xiàn)線程間的通信,有哪些方法?

  • 必須配合 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 工具類。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊9 分享