Java CountDownLatch线程同步源码硬核解析
场景
有时间在主线程中开启了多线程后,主线程需要等所有线程执行完毕才能return,这个时候就需要在return前拦一下,直到所有线程执行完毕。
或者,某些场景下需要多个线程同一时间执行,需要在起步的时候统一拦一下,然后收到通知再运行。
java.util.concurrent.CountDownLatch就能实现我们上面的这些需求。
CountDownLatch
CountDownLatch是通过一个计数器来实现的,计数器的初始化值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就相应得减1。当计数器到达0时,表示所有的线程都已完成任务,然后在闭锁上等待的线程就可以恢复执行任务
代码demo
直接上demo把。
主线程等待多线程完成后返回
CountDownLatch countDownLatch = new CountDownLatch(5); for (int i = 0; i < 5; i++) { new Thread(() -> { String name = Thread.currentThread().getName(); System.out.println(name + "等待5秒" + LocalDateTime.now()); try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println(name + "扣减1" + LocalDateTime.now()); countDownLatch.countDown(); }).start(); } try { countDownLatch.await(); } catch (InterruptedException e) { throw new RuntimeException(e); } System.out.println("finish");
执行结果
让所有线程同一时间执行
CountDownLatch countDownLatch = new CountDownLatch(1); for (int i = 0; i < 5; i++) { new Thread(() -> { String name = Thread.currentThread().getName(); try { System.out.println(name + "准备" + LocalDateTime.now()); countDownLatch.await(); System.out.println(name + "完成" + LocalDateTime.now()); } catch (InterruptedException e) { throw new RuntimeException(e); } }).start(); } try { Thread.sleep(5000); System.out.println("link start"); } catch (InterruptedException e) { throw new RuntimeException(e); } countDownLatch.countDown();
执行结果
到此这篇关于Java CountDownLatch线程同步源码硬核解析的文章就介绍到这了,更多相关Java CountDownLatch内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
PowerJobAutoConfiguration自动配置源码流程解析
这篇文章主要为大家介绍了PowerJobAutoConfiguration自动配置源码流程解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-12-12springBoot @Scheduled实现多个任务同时开始执行
这篇文章主要介绍了springBoot @Scheduled实现多个任务同时开始执行,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-12-12Java中为什么重写equals()也需要重写hashCode方法
这篇文章主要介绍了Java中为什么重写equals()也需要重写hashCode(),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-04-04
最新评论