ホームページ > Java > &#&チュートリアル > Java 同時実行における CountDownLatch と CyclicBarrier の違いは何ですか?

Java 同時実行における CountDownLatch と CyclicBarrier の違いは何ですか?

WBOY
リリース: 2023-09-06 15:33:12
転載
1286 人が閲覧しました

Java 同時実行における CountDownLatch と CyclicBarrier の違いは何ですか?

CountDownLatch と CyclicBarrier はどちらもマルチスレッド環境で使用され、その一部です。

Java Doc によると -

CountDownLatch - 他のスレッドで実行された一連の操作が完了するまで 1 つ以上のスレッドを待機できるようにする同期補助。

CyclicBarrier - スレッドのグループが共通のバリア ポイントに到達するまで相互に待機できるようにする同期補助。

#紳士諸君。 No.KeyCyclicBarrierCountDownLatch2実行中Runnable を提供できるコンストラクターがあります。 そのようなコンストラクターはありません3Thread / taskスレッド数を維持しますタスク数を維持します tr>4.5#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 の例
1

#Basic

共通の障害点に到達するのをすべて待機しているスレッドのグループの同期を可能にします。

他のスレッドで実行された一連の操作が完了するまで 1 つ以上のスレッドが待機できるようにする同期補助。

##高度な拡張が可能です

使用はお勧めしません

使用することをお勧めします使用します。

例外

スレッドがブロックされている間にスレッドがブロックされた場合待機中 中断されると、待機中の他のすべてのスレッドが BrokenBarrierException をスローします。

現在のスレッドのみが

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:tutorialspoint.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート