JUC-CountDownLatch和CyclicBarrier
CountDownLatch等待多线程完成,该工具类适用于主线程等待其他子线程结束后再执行的场景
public class CountDownLatchTest {public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(2);
// 初始化线程个数
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("第一个子线程countDown");
countDownLatch.countDown();
// 线程个数减一
System.out.println("第一个线程继续运行");
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("第一个线程继续运行");
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("第二个子线程countDown");
countDownLatch.countDown();
// 线程个数减一
System.out.println("第二个线程继续运行");
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("第二个线程继续运行");
}
}).start();
countDownLatch.await();
System.out.println("主线程执行结束");
}
}
运行结果
第二个子线程countDownCyclicBarrier 可循环使用的屏障,使一组线程都达到屏障点的时候才放行。
第一个子线程countDown
第二个线程继续运行
第一个线程继续运行
主线程执行结束
第一个线程继续运行
第二个线程继续运行
public class CyclicBarrierTest implements Runnable {
// 屏障数为4,下面4个子线程都执行到屏障点的时候才放行,this为放行后执行的线程,该线程执行完后才继续执行各个子线程
private CyclicBarrier cyclicBarrier = new CyclicBarrier(4,this);
private Executor executor = Executors.newFixedThreadPool(4);
public AtomicInteger count = new AtomicInteger(0);
private void count() {
for(int i = 0;
i<4;
i++){
executor.execute(new Runnable() {
@Override
public void run() {
for (int j = 0;
j<10;
j++) {
count.getAndIncrement();
}
try {
System.out.println("子线程等待");
cyclicBarrier.await();
System.out.println("子线程结束");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
});
}
}@Override
public void run() {
System.out.println("阻塞线程执行");
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("计数结果:"+count.get());
System.out.println("阻塞线程结束");
}public static void main(String[] args) {
CyclicBarrierTest test =new CyclicBarrierTest();
test.count();
}}
CountDownLatch和CyclicBarrier的区别
【JUC-CountDownLatch和CyclicBarrier】CountDownLatch : (一个或者多个等待N个)一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。对于CountDownLatch来说,重点是那个“一个线程”, 是它在等待, 而另外那N的线程在把“某个事情”做完之后可以继续等待,可以终止。
CyclicBarrier: (N个线程相互等待)任何一个线程完成之前,所有的线程都必须等待。重点是那N个线程,他们之间任何一个没有完成,所有的线程都必须等待。
推荐阅读
- 急于表达——往往欲速则不达
- 第三节|第三节 快乐和幸福(12)
- 20170612时间和注意力开销记录
- 2.6|2.6 Photoshop操作步骤的撤消和重做 [Ps教程]
- 对称加密和非对称加密的区别
- 眼光要放高远
- 樱花雨
- 前任
- 2020-04-07vue中Axios的封装和API接口的管理
- 烦恼和幸福