Java提高——JUC线程CountDownLatch闭锁
CountDownLatch闭锁
- java5.0后在java.util.concurrent包中提供了许多种并发容器类来改进同步容器的性能。
- CountdownLatch一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
- 闭锁可以延迟线程的进度知道其到达终止状态,闭锁可以用来确保某些活动直到其他其他活动都完成才继续执行:
1)确保某个计算在其需要的所有资源都被初始化之后才继续执行;
2)确保某个服务在其依赖的所有其他服务都已经启动之后才启动;
3)等待直到某个操作所有参与者都准备就绪再继续执行。
实例:
public class TestCountDownLatch { public static void main(String[] args) { CountDownLatch countDownLatch = new CountDownLatch(5); Latch latch = new Latch(countDownLatch); Long start = System.currentTimeMillis(); for (int i = 0; i < 10; i++) { new Thread(latch).start(); } Long end = System.currentTimeMillis(); System.out.println("消耗的时间 "+(end-start)); } } class Latch implements Runnable{ private CountDownLatch countDownLatch; public Latch(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } @Override public void run() { for (int i = 0; i < 50000; i++) { if (i%2==0){ System.out.println(i); } } } }
这样无法求出消耗的时间,因为main线程和其余的10个线程是同时执行的,没法求出时间
我们希望当其余的10个线程执行完了之后再执行main线程,这样求出消耗的时间。
/** * @author chenpeng * @date 2018/7/10 22:24 * * CountDownLatch:闭锁 在完成某些运算时只有其他线程的运算全部完成,当前运算才会继续执行 */ public class TestCountDownLatch { public static void main(String[] args) { //每个线程操作都会使括号中的数字递减一 CountDownLatch countDownLatch = new CountDownLatch(10); Latch latch = new Latch(countDownLatch); Long start = System.currentTimeMillis(); for (int i = 0; i < 10; i++) { new Thread(latch).start(); } //让线程等待 try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } Long end = System.currentTimeMillis(); System.out.println("消耗的时间 "+(end-start)); } } class Latch implements Runnable{ private CountDownLatch countDownLatch; public Latch(CountDownLatch countDownLatch) { this.countDownLatch = countDownLatch; } @Override public void run() { synchronized (this){ try { for (int i = 0; i < 50000; i++) { if (i%2==0){ System.out.println(i); } } } finally { //闭锁减一,直到为0,一定要执行 countDownLatch.countDown(); } } } }