多线程之CountdownLatch
1 说明
CountdownLatch, 用来进行线程同步协作,等待所有线程完成倒计时.
构造参数用来初始化等待计数值,await() 用来等待计数归零,countDown() 用来让计数减一.
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(3);
new Thread(() -> {
log.debug("begin...");
sleep(1);
latch.countDown();
log.debug("end...{}", latch.getCount());
}).start();
new Thread(() -> {
log.debug("begin...");
sleep(2);
latch.countDown();
log.debug("end...{}", latch.getCount());
}).start();
new Thread(() -> {
log.debug("begin...");
sleep(1.5);
latch.countDown();
log.debug("end...{}", latch.getCount());
}).start();
log.debug("waiting...");
latch.await();
log.debug("wait end...");
}
运行结果:
08:44:00.778 c.TestCountDownLatch [main] - waiting...
08:44:00.778 c.TestCountDownLatch [Thread-2] - begin...
08:44:00.778 c.TestCountDownLatch [Thread-0] - begin...
08:44:00.778 c.TestCountDownLatch [Thread-1] - begin...
08:44:01.782 c.TestCountDownLatch [Thread-0] - end...2
08:44:02.283 c.TestCountDownLatch [Thread-2] - end...1
08:44:02.782 c.TestCountDownLatch [Thread-1] - end...0
08:44:02.782 c.TestCountDownLatch [main] - wait end...
线程池优化
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(3);
ExecutorService service = Executors.newFixedThreadPool(4);
service.submit(() -> {
log.debug("begin...");
sleep(1);
latch.countDown();
log.debug("end...{}", latch.getCount());
});
service.submit(() -> {
log.debug("begin...");
sleep(1.5);
latch.countDown();
log.debug("end...{}", latch.getCount());
});
service.submit(() -> {
log.debug("begin...");
sleep(2);
latch.countDown();
log.debug("end...{}", latch.getCount());
});
service.submit(()->{
try {
log.debug("waiting...");
latch.await();
log.debug("wait end...");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
}
运行结果:
08:52:25.831 c.TestCountDownLatch [pool-1-thread-3] - begin...
08:52:25.831 c.TestCountDownLatch [pool-1-thread-1] - begin...
08:52:25.831 c.TestCountDownLatch [pool-1-thread-2] - begin...
08:52:25.831 c.TestCountDownLatch [pool-1-thread-4] - waiting...
08:52:26.835 c.TestCountDownLatch [pool-1-thread-1] - end...2
08:52:27.335 c.TestCountDownLatch [pool-1-thread-2] - end...1
08:52:27.835 c.TestCountDownLatch [pool-1-thread-3] - end...0
08:52:27.835 c.TestCountDownLatch [pool-1-thread-4] - wait end...