1、CountDownLatch
![CountDownLatch和CyclicBarrier](http://p2.ttnews.xyz/loading.gif)
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](http://p2.ttnews.xyz/loading.gif)
柵欄類似於閉鎖,它能阻塞一組線程直到某個事件的發生。柵欄與閉鎖的關鍵區別在於,所有的線程必須同時到達柵欄位置,才能繼續執行。閉鎖用於等待事件,而柵欄用於等待其他線程。
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>
閱讀更多 遠帆Dragon 的文章