CountDownLatch基于计数器的思想,对线程的执行流程进行控制,一般用于多个任务都完成才可进行下一步的情况.
上代码:
public static void main(String[] args) {
/**
* 创建 CountDownLatch 并指定计数器的值为3
*/
CountDownLatch countDownLatch = new CountDownLatch(3);
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
3,10,10,TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(1),
new ThreadPoolExecutor.DiscardOldestPolicy());
Runner runner = new Runner(countDownLatch);
threadPoolExecutor.execute(runner);
threadPoolExecutor.execute(runner);
threadPoolExecutor.execute(runner);
try {
/**
* 直到计数器的值减为0,否则一直阻塞在此处
*/
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("===The End===");
threadPoolExecutor.shutdownNow();
}
static class Runner implements Runnable {
private CountDownLatch countDownLatch;
public Runner(CountDownLatch countDownLatch) {
this.countDownLatch = countDownLatch;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "执行");
try {
Thread.sleep((long) (Math.random() * 5000 + 1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
/**
* 每一个线程执行一次,计数器的值减1
*/
countDownLatch.countDown();
}
}