简述
CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。CountDownLatch 内部是用一个技术器实现的,计数器的初始值可以设为线程的数量,当一个线程任务结束之后,调用countDown()方法。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。
简单使用场景
有时候需要多个线程同时工作但是一个线程需要等其他线程工作结束后,才能开始。举个例子,开启多个线程分块下载一个大文件,每个线程只下载固定的一截,最后由另外一个线程来拼接所有的分段,那么这时候我们可以考虑使用CountDownLatch来控制并发。
例子
class SecondThread extends Thread {
private CountDownLatch countDownLatch;
public SecondThread(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "start!");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
countDownLatch.countDown();
}
System.out.println(Thread.currentThread().getName() + "end!");
}
}
class FristThread extends Thread {
private CountDownLatch countDownLatch;
private Long time;
public FristThread(CountDownLatch countDownLatch, Long time) {
this.countDownLatch = countDownLatch;
this.time = time;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "start!");
try {
Thread.sleep(time);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
countDownLatch.countDown();
}
System.out.println(Thread.currentThread().getName() + "end!");
}
}
@Test
public void testCountDownLatch() {
CountDownLatch countDownLatch = new CountDownLatch(2);
System.out.println("main start!");
FristThread thread1 = new FristThread(countDownLatch, 10000l);
thread1.setName("thread1");
thread1.start();
SecondThread thread2 = new SecondThread(countDownLatch);
thread2.setName("thread2");
thread2.start();
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main end!");
}
结果
main start!
thread1start!
thread2start!
thread2end!
thread1end!
main end!