多线程JUC包之CountDownLatch

拥有回忆 提交于 2020-01-29 23:51:48

CountDownLatch

用来控制一个或者多个线程等待多个线程。

内部使用了一个计数器,每次调用 countDown() 方法会让计数器的值减 1,减到 0 的时候,那些因为调用 await() 方法而在等待的线程就会被唤醒。


import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;

public class CountDownLatchExample {

    public static long a = 0;

    public static void main(String[] args) throws InterruptedException {

        final int threadSize = 1000;

        final CountDownLatch countDownLatch = new CountDownLatch(threadSize);

        AtomicInteger atomicInteger=new AtomicInteger();//原子性类

        ExecutorService executorService = Executors.newCachedThreadPool();

        long start = System.currentTimeMillis();

        for (int i = 0; i < threadSize; i++) {
            executorService.execute(() -> {
//                a++;  这里不是原子性操作,在多线程环境下有问题,使用下面这种操作
                atomicInteger.incrementAndGet();
                countDownLatch.countDown();
            });
        }

//        executorService.execute(()->{
//
//            try {
//                //  countDownLatch 的一个很严重的问题 报错了没有减的话,线程会进入无限等待中
//                int i=1/0;
//            } catch (Exception e) {
//                e.printStackTrace();
//            } finally {
//                countDownLatch.countDown();
//            }
//        });

        long end = System.currentTimeMillis();

        System.out.println(end-start+"\t毫秒的执行时间");

        countDownLatch.await();
        executorService.shutdown();

        System.out.println("value:\t"+atomicInteger);
    }
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!