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

  • Post author:
  • Post category:java

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时,就会执行如下代码

09fbabfcc8e5

09fbabfcc8e5

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

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