CountDownLatch和CyclicBarrier
2021-05-07 本文已影响0人
lconcise
CountDownLatch
image.png主要用来解决一个线程等待多个线程的场景。
Demo
public static void main(String[] args) throws InterruptedException {
// 创建线程池,来执行任务
ThreadPoolExecutor executor = new ThreadPoolExecutor(
2, 5,
5, TimeUnit.SECONDS,
new ArrayBlockingQueue<>(1),
Thread::new,
new ThreadPoolExecutor.AbortPolicy());
CountDownLatch countDownLatch = new CountDownLatch(2);
// 任务一
executor.execute(() -> {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("执行A计划");
countDownLatch.countDown();
});
// 任务二
executor.execute(() -> {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("执行B计划");
countDownLatch.countDown();
});
// 等待
countDownLatch.await();
System.out.println("结束");
// 关闭线程池
executor.shutdown();
}
CyclicBarrier
image.png是一组线程之间的相互等待,CyclicBarrier的计数器是可以循环利用的,具备自动重置功能,一旦计数器减到0会自动重置到你设置的初始值。
public static void main(String[] args) {
// 创建线程池,来执行任务
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 3, 5,
TimeUnit.SECONDS,
new ArrayBlockingQueue<>(1),
Thread::new,
new ThreadPoolExecutor.AbortPolicy());
CyclicBarrier cyclicBarrier = new CyclicBarrier(2, () -> {
System.out.println("五一放假了");
executor.shutdown();
});
// 任务A
executor.execute(() -> {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("A完成工作");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
});
// 任务B
executor.execute(() -> {
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("B完成学习");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
});
System.out.println("start");
}