CountDownLatch闭锁

CountDownLatch :闭锁,在完成某些运算时,只有其他所有线程的运算全部完成,当前运算才继续执行

方法:

countDown​():减少锁存器的计数,如果计数达到零,释放所有等待的线程

await​():导致当前线程等到锁存器向下计数为零,除非线程为 interrupted

案例分析:

我们要统计50个线程执行完LatchDemo中的run()之后的时间,这时我们需要在LatchDemo中定义一个CountDownLatch闭锁 CountDownLatch创建的时候可以给定一个初始化值

 

public class CountDownLatchTest {

    public static void main(String[] args) {
        //构造一个以给定计数初始化的 CountDownLatch
        //初始值即为要统计的线程数
        final CountDownLatch latch = new CountDownLatch(50);
        LatchDemo ld = new LatchDemo(latch);

        long start = System.currentTimeMillis();

        for (int i = 0; i < 50; i++) {
            new Thread(ld).start();
        }

        /*
            调用CountDownLatch的await()方法,只有该对象的锁存器计数为0时,即
            线程全部走完后,程序才会继续往下走
            这时就能统计出来50个线程都执行完之后的时间
         */
        try {
            latch.await();
        } catch (InterruptedException e) {
        }

        long end = System.currentTimeMillis();

        System.out.println("耗费时间为:" + (end - start));
    }

}

class LatchDemo implements Runnable {

    private CountDownLatch latch;

    public LatchDemo(CountDownLatch latch) {
        this.latch = latch;
    }

    @Override
    public void run() {

        try {
            for (int i = 0; i < 50000; i++) {
                if (i % 2 == 0) {
                    System.out.println(i);
                }
            }
        } finally {
            //当线程执行完run方法之后,调用countDown()使锁存器计数减1
            latch.countDown();
        }

    }

}

猜你喜欢

转载自blog.csdn.net/fy_java1995/article/details/84062817