无名 发表于 2022-5-8 18:40:37

【HC】Java源码分析:CyclicBarrier第一部分

CyclicBarrier字面意思回环栅栏,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用。我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了。

举个例子哈:当我们10个人相约包车去成都玩,车早上就在学校门口等着我们10个人上车(规定只有10个人全部上车后才能开车出发),现在陆陆续续的一个一个同学上车了,在第10个人到来之前,其它人都必须等待。在第10个人到来之后车就出发去成都了每个人就开始该干嘛就干嘛去了。

以上就是CyclicBarrier.

当然了,上面说的是正常不出意外的情况。CyclicBarrier和等车的例子一样,会出现各种情况(意外):

例如:在车上等待的同学,突然有事(例如:老板打电话有事)不去玩了,则就会告诉所有人,我不去了哈,于是大家就都不需要等待了,各自下车去忙自己的事去。

还有一些情况,这里就不用例子一一来说明情况了。

【*】CyclicBarrier常见的方法:
有两个构造函数

CyclicBarrier(int parties)
创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在启动 barrier 时执行预定义的操作。

CyclicBarrier(int parties, Runnable barrierAction)
创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动 barrier 时执行给定的屏障操作,该操作由最后一个进入 barrier 的线程执行。

int await()
在所有参与者都已经在此 barrier 上调用 await 方法之前,将一直等待。 所有线程都到达barrier状态再同时执行后续任务;

int await(long timeout, TimeUnit unit)
在所有参与者都已经在此屏障上调用 await 方法之前将一直等待,或者超出了指定的等待时间。

下面先看几个关于CyclicBarrier的应用,然后再来从源码的角度来分析。
http://cdn.u1.huluxia.com/g3/M01/38/9E/wKgBOV3JC9yAV8HLAABo3Uvlgtw431.jpg
页: [1]
查看完整版本: 【HC】Java源码分析:CyclicBarrier第一部分