首頁 >Java >java教程 >在Java並發中,CountDownLatch和CyclicBarrier之間的差異是什麼?

在Java並發中,CountDownLatch和CyclicBarrier之間的差異是什麼?

WBOY
WBOY轉載
2023-09-06 15:33:121289瀏覽

在Java並發中,CountDownLatch和CyclicBarrier之間的差異是什麼?

CountDownLatch 和 CyclicBarrier 都用於多執行緒環境,並且它們都是多執行緒環境的一部分。

根據 Java Doc -

CountDownLatch - 允許一個或多個執行緒等待的同步輔助工具直到其他執行緒中執行的一組操作完成。

CyclicBarrier - 一種同步輔助工具,允許一組執行緒相互等待到達公共屏障點。

##1允許一組執行緒的同步輔助全部等待彼此到達公共障礙點。 #一種允許一個或多個執行緒的同步輔助工具等待其他執行緒中執行的一組操作完成。 2 可運行 tr>3可進階
先生。編號 Key CyclicBarrier CountDownLatch

#基本

它有一個可以提供Runnable 的建構子。

它沒有這樣的建構子

線程/任務

它維護執行緒計數

它維護任務計數

4.

它不建議使用

######建議使用。 ##################5#########################如果一個執行緒等待時被中斷,則所有其他等待執行緒都會拋出B rokenBarrierException#############只有當前執行緒會拋出######InterruptedException,不會影響其他執行緒####### ##############CyclicBarrier 範例###
public class Main {
   public static void main(String args[]) throws InterruptedException {
      ExecutorService executors = Executors.newFixedThreadPool(4);
      CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
      executors.submit(new Service1(cyclicBarrier));
      executors.submit(new Service1(cyclicBarrier));
      executors.submit(new Service2(cyclicBarrier));
      executors.submit(new Service2(cyclicBarrier));
      executors.submit(new Service2(cyclicBarrier));
      Thread.sleep(3000);
      System.out.println("Done");
   }
}
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class Service1 implements Runnable {
   CyclicBarrier cyclicBarrier;
   public Service1(CyclicBarrier cyclicBarrier) {
      super();
      this.cyclicBarrier = cyclicBarrier;
   }
   @Override
   public void run() {
      System.out.println("Services1" + cyclicBarrier.getNumberWaiting());
      while (true) {
         try {
            cyclicBarrier.await();
         } catch (InterruptedException | BrokenBarrierException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }
      }
   }
}
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class Service2 implements Runnable {
   CyclicBarrier cyclicBarrier;
   public Service2(CyclicBarrier cyclicBarrier) {
      super();
      this.cyclicBarrier = cyclicBarrier;
   }
   @Override
   public void run() {
      System.out.println("Services2" + cyclicBarrier.getNumberWaiting());
      while (true) {
         try {
            cyclicBarrier.await();
         } catch (InterruptedException | BrokenBarrierException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
         }
      }
   }
}
###CountDownLatch 範例###
public class Main {
   public static void main(String args[]) throws InterruptedException {
      ExecutorService executors = Executors.newFixedThreadPool(4);
      CountDownLatch latch= new CountDownLatch(2);
      executors.submit(new Service1(latch));
      executors.submit(new Service2(latch));
      latch.await();
      System.out.println("Done");
   }
}
import java.util.concurrent.CountDownLatch;

public class Service1 implements Runnable {

   CountDownLatch latch;
   public Service1(CountDownLatch latch) {
      super();
      this.latch = latch;
   }

   @Override
   public void run() {
      try {
         Thread.sleep(20000);
      } catch (InterruptedException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
      latch.countDown();
      System.out.println("Services2"+latch.getCount());
   }
}
import java.util.concurrent.CountDownLatch;
public class Service2 implements Runnable {
   CountDownLatch latch;
   public Service2(CountDownLatch latch) {
      super();
      this.latch = latch;
   }
   @Override
   public void run() {
      try {
         Thread.sleep(20000);
      } catch (InterruptedException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }
      latch.countDown();
      System.out.println("Services2"+latch.getCount());
   }
}
###

以上是在Java並發中,CountDownLatch和CyclicBarrier之間的差異是什麼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除