CountDownLatch闭锁

CountDownLatch是一个同步工具类,join的增强版。允许一个或多个线程,等待其他一组线程完成操作,再继续执行

  • public CountDownLatch(int count); 构造函数,初始化计数器值为count,count只能被设置一次
  • public void await()throws InterruptedException; 调用await()方法的线程会被挂起,直到count值为0才继续执行
  • public boolean await(longtimeout, TimeUnit unit)throws InterruptedException; 和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
  • public void countDown();将count值减1

    它是通过控制计数器的值来达到等待的目的。当计数器的值>0时,countDownLatch.await()会阻塞当前线程,直到其他线程调用countDownLatch.countDown()将计数器的值减到0时,阻塞线程将被唤醒。计数器的值>0时调用await()方法不会阻塞当前线程。主线程必须在启动其他线程后立即调用CountDownLatch.await()方法。这样主线程的操作就会在这个方法上阻塞,直到其他线程完成各自的任务。

join阻塞当前线程等待线程

t.join()方法:阻塞调用此方法的线程(calling thread)进入TIMED_WAITING状态,直到线程t完成,此线程再继续;通常用于在main()主线程内,等待其它线程完成再结束main()主线程

  • Join方法实现是通过wait()。 当main线程调用t.join时候,main线程会获得线程对象t的锁(wait意味着拿到该对象的锁),调用该对象的wait(),直到该对象唤醒main线程 ,比如退出后。这就意味着main线程调用t.join时,必须能够拿到线程t对象的锁。

join与countDownLatch区别

  • join用于让当前执行线程等待join线程执行结束。
  • 其实现原理是不停检查join线程是否存活,如果join线程存活则让当前线程永远wait。
  • countDownLatch没有这个线程,只要count减小到0,不管被等待线程是否执行结束,等待线程都可以继续执行(被唤醒,进入可执行状态)。

yield与join方法的区别

yield()方法:暂停当前正在执行的线程对象,并允许执行其他线程。

  • yield()应该做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其他线程获得运行机会。因此,使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。

结论:yield()从未导致线程转到等待/睡眠/阻塞状态。在大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。

join()方法:线程实例的join()方法可以使得一个线程在另一个线程结束后再执行,即也就是说使得当前线程可以阻塞其他线程执行;

  • thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。

CountDownLatch闭锁,join和yield的区别相关推荐

  1. 关于多线程中sleep、join、yield的区别

    点击上方 "程序员小乐"关注, 星标或置顶一起成长 每天凌晨00点00分, 第一时间与你相约 每日英文 Good friends are like stars. You don't ...

  2. Java并发编程笔记之 CountDownLatch闭锁的源码分析

    转 自: Java并发编程笔记之 CountDownLatch闭锁的源码分析 ​ JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 C ...

  3. 并发编程-16AQS同步组件之CountDownLatch 闭锁

    文章目录 脑图 CountDownLatch闭锁 示例 Thread#join() CountDownLatch CountDownLatch示例二 await一直等待其他线程执行完 CountDow ...

  4. 同步工具之CountDownLatch闭锁

    CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待 ,即CountDownLatch允许一个或多个线程等待其他线程完成操作.闭锁可以延迟 ...

  5. Python中threading的join和setDaemon的区别及用法 例子

    Python中threading的join和setDaemon的区别及用法 Python多线程编程时,经常会用到join()和setDaemon()方法,今天特地研究了一下两者的区别. 1.join ...

  6. CountDownLatch闭锁

    CountDownLatch :闭锁,在完成某些运算时,只有其他所有线程的运算全部完成,当前运算才继续执行 方法: countDown​():减少锁存器的计数,如果计数达到零,释放所有等待的线程 aw ...

  7. java sleep join_Java多線程之sleep,wait,join和yield關鍵字

    在java或者android中,使用Thread和Runnable就可以玩多線程了,這個成本比較低,也沒什么好說的,今天主要是針對多線程中主要的關鍵字wait,sleep,join和yield做個筆記 ...

  8. 聊聊高并发(二十六)解析java.util.concurrent各个组件(八) 理解CountDownLatch闭锁

    CountDownLatch闭锁也是基于AQS实现的一种同步器,它表示了"所有线程都等待,直到锁打开才继续执行"的含义.它和Semaphore的语意不同, Semaphore的获取 ...

  9. c++11中thread join和detach的区别

    线程状态: 在一个线程的生存期内,可以在多种状态之间转换,不同的操作系统可以实现不同的线程模型,定义许多不同的线程状态,每个状态还可以包含多个子状态,但大体来说,如下几种状态是通用的: 1)就绪:参与 ...

最新文章

  1. plsql 为空显示 0 的函数_记住这三个检测函数,彻底清除公式当中的0值
  2. php连接oracle10g,php连接Oracle Database 10g Express Edition
  3. mysql配置文件调优
  4. 【控制】《鲁棒控制-线性矩阵不等式处理方法》-俞立老师-第10章-滤波器设计
  5. 转译:Oracle 中 Object_iD 和 Data_Object_ID 的区别
  6. mysql教程or怎么用_MySQL中or语句用法示例
  7. SQL实战篇:SQL行列转换及真题
  8. 【模板】差分约束算法
  9. tensorflow中的Supervisor
  10. Spring Security Oauth2 认证(获取token/刷新token)流程
  11. Generator的异步编程
  12. stl非变易算法(一)
  13. 拓端tecdat|在Python和R中使用交叉验证方法提高模型性能
  14. QTableview
  15. python就业方向-学完Python的7大就业方向,哪个赚钱多?
  16. 整理一下vue 移动端模板框架搭建
  17. 搜狗收录提交入口-搜狗网站批量提交方法
  18. Epicor 调试 customization
  19. CIO40: IT从之“CRM”与“OA”
  20. Eclipse的JVM语言Xtend达到2.3 M7

热门文章

  1. 云服务器和共享主机,共享虚拟主机、独享虚拟主机还是云服务器?
  2. mysql innodb 大小,更改Innodb 数据页大小优化MySQL
  3. 对于试衣网的一点看法
  4. 阿里巴巴计划今日中午推出1688.com批发网
  5. 李航(统计学习方法第四章)
  6. 科研合作应该互相尊重
  7. 【木头Cocos2d-x 005】穷鬼之mac cocos2d-x环境搭建-成功!(VMWare + mac lion+xcode)
  8. 矩阵指数(The Exponential of a Matrix)
  9. 线性代数:矩阵的LU分解
  10. 怎么把win10设置Linux样式,老司机教你把win10系统界面换成win7样式的方法