Java 併發中 CountDownLatch 與 CyclicBarrier 之間的區別
CountDownLatch 和 CyclicBarrier 都用於多執行緒環境中,並且二者都屬於。
根據 Java 文件 -
CountDownLatch - 一種同步輔助工具,可讓一個或多個執行緒等待直到在其他執行緒中執行的一組操作完成。
CyclicBarrier - 一種同步輔助工具,可讓一組執行緒全部等待彼此到達通用柵欄點。
| 序號 | 關鍵 | CyclicBarrier | CountDownLatch |
|---|---|---|---|
| 1 | 基本 | 一種同步輔助工具,可讓一組執行緒全部等待彼此到達通用柵欄點。 | 一種同步輔助工具,可讓一個或多個執行緒等待直到在其他執行緒中執行的一組操作完成。 |
| 2 | 可執行 | 它有一個可以提供 Runnable 的建構函式。 | 它沒有這樣的建構函式 |
| 3 | 執行緒/任務 | 它維護執行緒計數 | 它維護任務計數 |
| 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());
}
}
廣告
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP