CountDownLatch和CyclicBarrier

1、CountDownLatch

CountDownLatch和CyclicBarrier

countDownLatch這個類使一個線程等待其他線程各自執行完畢後再執行。

是通過一個計數器來實現的,計數器的初始值是線程的數量。每當一個線程執行完畢後,計數器的值就-1,當計數器的值為0時,表示所有線程都執行完畢,然後在閉鎖上等待的線程就可以恢復工作了。

代碼:

<code>public class CountDownLatchTest {

public static void main(String[] args) {
final CountDownLatch latch = new CountDownLatch(2);
System.out.println("主線程開始執行…… ……");
//第一個子線程執行
ExecutorService es1 = Executors.newSingleThreadExecutor();
es1.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);
System.out.println("子線程:"+Thread.currentThread().getName()+"執行");
} catch (InterruptedException e) {
e.printStackTrace();
}
latch.countDown();
}
});
es1.shutdown();

//第二個子線程執行
ExecutorService es2 = Executors.newSingleThreadExecutor();
es2.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(3000);

} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("子線程:"+Thread.currentThread().getName()+"執行");
latch.countDown();
}
});
es2.shutdown();
System.out.println("等待兩個線程執行完畢…… ……");
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("兩個子線程都執行完畢,繼續執行主線程");
}
}
/<code>

2、CyclicBarrier

CountDownLatch和CyclicBarrier

柵欄類似於閉鎖,它能阻塞一組線程直到某個事件的發生。柵欄與閉鎖的關鍵區別在於,所有的線程必須同時到達柵欄位置,才能繼續執行。閉鎖用於等待事件,而柵欄用於等待其他線程。

CyclicBarrier可以使一定數量的線程反覆地在柵欄位置處彙集。當線程到達柵欄位置時將調用await方法,這個方法將阻塞直到所有線程都到達柵欄位置。如果所有線程都到達柵欄位置,那麼柵欄將打開,此時所有的線程都將被釋放,而柵欄將被重置以便下次使用。

代碼:

<code>public class CyclicBarrierTest {
// 自定義工作線程
private static class Worker extends Thread {
private CyclicBarrier cyclicBarrier;

public Worker(CyclicBarrier cyclicBarrier) {
this.cyclicBarrier = cyclicBarrier;
}

@Override
public void run() {
super.run();

try {
System.out.println(Thread.currentThread().getName() + "開始等待其他線程");
cyclicBarrier.await();
System.out.println(Thread.currentThread().getName() + "開始執行");
// 工作線程開始處理,這裡用Thread.sleep()來模擬業務處理
Thread.sleep(1000);

System.out.println(Thread.currentThread().getName() + "執行完畢");
} catch (Exception e) {
e.printStackTrace();
}
}
}

public static void main(String[] args) {
int threadCount = 3;
CyclicBarrier cyclicBarrier = new CyclicBarrier(3);

for (int i = 0; i < threadCount; i++) {
System.out.println("創建工作線程" + i);
Worker worker = new Worker(cyclicBarrier);
worker.start();
}
}
}/<code>


分享到:


相關文章: