zoukankan      html  css  js  c++  java
  • Java并发组件二之CyclicBarriar

    使用场景:

    多个线程相互等待,直到都满足条件之后,才能执行后续的操作。CyclicBarrier描述的是各个线程之间相互等待的关系。

    使用步骤:

    1. 正常实例化:CyclicBarrier sCyclicBarrier=new CyclicBarrier(3);
    2. 带runnable的实例化,打破屏障时,优先执行Runnable:CyclicBarrier sCyclicBarrier=new CyclicBarrier(3,new Runnable(){//todo});
    3. await线程:sCyclicBarrier.await();
    4. 当wait线程数量为,count值时。唤醒所有等待线程。

    原理:这里直接用源码解释(后续补充)

    1. 锁用的是ReentrantLock重入锁。ReentrantLock lock = new ReentrantLock()
    2. 获取该锁的condition实例。Condition trip = lock.newCondition()
    3. wait线程,用的是Condition.await
    4. signal线程,用的是Condition.signalAll
    5. 两个构造函数,初始化parties值,count值,以及Runnable(唤醒时优先执行runnable)
    6. count值是用来计算线程数的。每有一个线程执行了await方法,--count。直到count==0
    7. await方法,包含了是否超时,以及超时时间
    8. dowait是线程wait的主要逻辑代码。当count==0时执行唤醒操作。不为0时,进入for循环,执行Condition.await。
    9. dowait中的for循环是为了超时操作的逻辑。
    10. 正常跳出for循环是通过dowait方法中的(nextGeneration()重新实例化了gennaration)
    11. breakBarrier() 打破屏障,唤醒所有wait线程
    12. nextGeneration() 更新状态,唤醒所有wait线程
    13. reset()重置状态。里面调用了breakBarrier()和nextGeneration()
  • 相关阅读:
    枚举与常量需要注意的一个问题
    parted分区用法
    Linux下常用服务的端口号
    NFS服务
    mount用法
    Rsync服务部署
    常见的RAID级别
    SQL注入语句 (很全)
    数据库被注入daxia123或cn.jxmmtv.com原因及解决办法
    StringTemplate.net模板技术用法
  • 原文地址:https://www.cnblogs.com/Courage129/p/12725400.html
Copyright © 2011-2022 走看看