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();
            }
        }
    }
}
Java提高——JUC线程CountDownLatch闭锁