美文网首页java基础
CountDownLatch的使用

CountDownLatch的使用

作者: Vic_is_new_Here | 来源:发表于2022-03-06 16:46 被阅读0次

        CountDownLatch是java中一个协调多线程的工具类,假如多线程在执行后,需要等待所有都执行完再执行下一步,那么就可以使用CountDownLatch。

        比如将会有10个线程,那么可以CountDownLatch latch =new CountDownLatch(10),在每个线程内减少值(latch.countDown()),在下面就可以使用latch.await()方法等待所有线程都执行完成,才继续执行下去。还可以将多线程内报的错误带出来,详情见代码中AtomicReference> exe =new AtomicReference<>(new ArrayList<>());


public void excuteThread(int num)throws Throwable {

MyThreadConfig threadConfig =new MyThreadConfig();

    ThreadPoolTaskExecutor executor = threadConfig.taskExecutor();

    int excuteTimes = num /10;

    CountDownLatch latch =new CountDownLatch(excuteTimes);

    AtomicInteger count =new AtomicInteger(0);

    AtomicReference<List<Exception>> exe = new AtomicReference<>(new ArrayList<>());

    for (int i =0; i < excuteTimes; i++) {

        int finalI = i;

        executor.execute(() -> {

            Thread.currentThread().setName("thread-" +finalI);

            System.out.println(Thread.currentThread().getId());

            System.out.println(Thread.currentThread().getName() +" sleep begin");

            try {

                Thread.sleep(500);

                if (finalI ==0) {

                    throw new RuntimeException("第0个的错");

                }

            if (finalI ==1) {

                throw new RuntimeException("第1个的错");

                }

                if (finalI ==2) {

                        throw new RuntimeException("第2个的错");

                }

                    if (finalI ==4) {

                        int a =1 /0;

                        }

                    count.incrementAndGet();

                }catch (Exception e) {

                    e.printStackTrace();

                        exe.get().add(e);

                }finally {

                    latch.countDown();

                }

                    System.out.println(Thread.currentThread().getName() +"sleep over");

        });

    }

    latch.await();

    if (count.get() != excuteTimes) {

        exe.get().forEach(e -> {

        e.printStackTrace();

        });

        throw new RuntimeException("多线程内部报错了!");

    }

    System.out.println("顺利执行完成!");

}

相关文章

  • countdown设计模式

    使用JDK自带的countdownLatch

  • 8. Java中的并发工具类

    CountDownLatch 作用:等待一个或多个线程执行完成; 使用: CountDownLatch cdl =...

  • JUC并发编程-6.CountDownLatch源码解析

    1.CountDownLatch相关API使用 运行结果 2.CountDownLatch相关API解读 new ...

  • CountDownLatch的使用

    一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 Co...

  • CountDownLatch的使用

    1 CountDownLatch CountDownLatch.Sync继承了AbstractQueuedSync...

  • CountDownLatch的使用

    CountDownLatch是java中一个协调多线程的工具类,假如多线程在执行后,需要等待所有都执行完再执行下一...

  • CountDownLatch 使用

    java.util.concurrent.CountDownLatch是一个并发结构,它允许一个或多个线程等待一组...

  • CountDownLatch使用

    该类是一个同步功能的辅助类,使用效果是给定一个技术,当使用这个类的线程判断计数不为0时,则成wait状态,如果为0...

  • CountDownLatch使用

    CountDownLatch使用 CountDownLatch是java中的一个同步工具类.用于对线程的阻塞和唤醒...

  • CountDownLatch使用

    CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅助类。 内部有一个...

网友评论

    本文标题:CountDownLatch的使用

    本文链接:https://www.haomeiwen.com/subject/unkwrrtx.html