美文网首页
怎么实现所有线程在等待某个事件的发生才会去执行?

怎么实现所有线程在等待某个事件的发生才会去执行?

作者: 子暄_5f17 | 来源:发表于2018-09-17 23:09 被阅读0次

java里面实现这个有两个办法,countdownlatch和cyclicbarrier。

cyclicbarrier可以重复使用,它允许一组线程相互等待,直到达到某个公共屏障点。cyclicbarrier不会阻塞主线程,只会阻塞子线程。

countdownlatch不可以重复使用,会阻塞主线程。主线程调用await方法,主线程阻塞。子线程调用countdown方法,触发计数。countdownlatch内部是实现了AQS,初始化的时候,new  CountDownLatch(n);将AQS的state设置为n。

await方法->acquireSharedInterruptibly->doAcquireSharedInterruptibly->shouldParkAfterFailedAcquire&parkAndCheckInterrupt->LockSupport.park.根据此调用链,会将当前线程阻塞。shouldParkAfterFailedAcquire方法相当于重新构造阻塞队列,对于前驱节点的waitstate大于0的删除,不是SIGNAL的赋值为SIGNAL。

countdown是个解锁的过程,每个子线程执行一次countdown,state就减一,state等于0时,就会执行如下代码

unparkSuccessor方法的参数是头结点,此时的队列应该是只有一个等待节点,就是主线程。s不等于null,s是主线程。

cyclicbarrier内部使用Lock,每一个子线程执行await,计数减一,当最后一个子线程的计数为0时,会执行cyclicbarrier构造函数中的Runable参数的run方法。

相关文章

  • 怎么实现所有线程在等待某个事件的发生才会去执行?

    java里面实现这个有两个办法,countdownlatch和cyclicbarrier。 cyclicbarri...

  • C++同步并发操作

    何时需要线程同步 线程完成前,需要等待另一个线程执行 线程需要等待特定事件发生 线程等待某个条件变为true 线程...

  • Java JUC基础知识总结-0

    CyclicBarrier可以实现让一组线程等待至某个状态后,再全部同时执行。为什么叫Cyclic呢,当所有线程都...

  • Java 线程 - CountDownLatch / Cycli

    CountDownLatch 一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行 CyclicBarr...

  • 常用并发编程工具类的使用笔记

    怎么写条件等待? 即:当xxx条件满足时,唤醒某个独立线程执行某个任务。应该怎么写? 场景1.一等多。一个线程等待...

  • java并发工具类

    等待多线程完成 主线程等待所有线程完成工作 实现 thread.join()方法 原理 join 用于让当前执行线...

  • C# ThreadPool

    在多线程的程序中,经常会出现两种情况: 1. 应用程序中线程把大部分的时间花费在等待状态,等待某个事件发生,...

  • 线程-11.24

    1.使用threading模块 单线程执行: 多线程执行: 主线程会等待所有的子线程结束后才结束 查看线程数量: ...

  • 闭锁和栅栏

    闭锁:可以延迟线程的进度直到线程到达某个终点状态,只有当某个条件满足的时候,所有线程才可能被并发执行。 栅栏:栅栏...

  • 初识JavaScript

    JavaScript实现 JavaScript 函数和事件通常,我们需要在某个事件发生时执行代码,比如当用户点击按...

网友评论

      本文标题:怎么实现所有线程在等待某个事件的发生才会去执行?

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