概念 :
固定多少个任务,每个线程执行完一次做一次减操作, 直至任务数为0,主线程才继续往下执行。
常用方法:
//声明任务个数为20
final CountDownLatch latch = new CountDownLatch(20);
// 任务数减1
latch.countDown();
//阻塞,直到任务数为0才被唤醒继续执行
latch.await();
使用场景:
所有子线程完成后主线程才继续往下执行。 适用于后在的工作依赖于前面的工作而执行。
原理:
底层也是用wait/notify机制实现, latch.await实际上相当于synchronized(latch){
this.wait();
}
而在countDown里面每调用一次值都为-1,直到为0为止,为0则触发notify();
示例源码:
20个线程运行完毕后通知主线程,主线获得通知后才会继续往下执行。
final CountDownLatch latch = new CountDownLatch(20);
for(int i=0; i<20; i++){
Thread t = new Thread(new Runnable(){
public void run(){
try {
semp.acquire();
} catch (InterruptedException e) {
e.printStackTrace();
}
SemaphoreTest.pool.add(Thread.currentThread());
bank.withDraw();
SemaphoreTest.pool.remove(Thread.currentThread());
semp.release();
latch.countDown();
}
}, "thread_" + i);
threads[i] = t;
t.start();
}
try {
latch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("============over=========");