每个线程通过调用await(),在CyclicBarrier障碍处“彼此等待”,一旦所有的线程都到达了CyclicBarrier(都调用了CyclicBarrier方法),所有的线程将一起再次被唤醒继续执行。
1.创建CyclicBarrier障碍
===================
当创建CyclicBarrier的时候,需要指定需要控制多少个线程同步。比如下面的CyclicBarrier设置为控制2个线程同步。
CyclicBarrier barrier = new CyclicBarrier(2);
2. 在CyclicBarrier障碍处等待
=======================
通过调用CyclicBarrier的await()方法进入等待状态,通常在线程完成自己的阶段性任务之后调用该方法。
barrier.await();
CyclicBarrier也提供了另一种方法指定等待超时的时间,当等待时间大于超时时间之后,即使还有其他的线程没调用await方法,该线程将自动唤醒继续执行。(朋友们约好了去旅游,等了10分钟你还不来,我就自己先去了)。
barrier.await(10, TimeUnit.SECONDS);
The waiting threads waits at theCyclicBarrieruntil either:
在CyclicBarrier处等待的线程被释放,继续执行的条件(满足下面的任一条件即可)
-
最后到达的线程调用了await() 方法
-
该线程被另一个线程打断(另一个线程调用其interrupt()方法)。
-
另一个处于等待状态的线程被打断
-
另一个处于等待状态的线程在CyclicBarrier处等待时超时。
-
某个外部线程调用了CyclicBarrier.reset()拆除障碍。
3. CyclicBarrier Action
========================
CyclicBarrier Action 相对不太好理解,可以把它理解为障碍自身的行为。该Action动作是一个线程,所有的线程都到达障碍之后,该线程将被执行。
Runnable barrierAction = 创建线程;
CyclicBarrier barrier = new CyclicBarrier(2, barrierAction);
如果这段代码仍然无法理解CyclicBarrier Action的作用,看下面的例子。
4. CyclicBarrier 例子
====================
下面的代码演示了如何使用CyclicBarrier进行线程同步:
Runnable barrier1Action = new Runnable() {
public void run() {
System.out.println("障碍1集合成功了,所有人都到了景点门口 ");
}
};
Runnable barrier2Action = new Runnable() {
public void run() {
System.out.println(“障碍2集合成功了,所有人都到了山顶”);
}
};
//障碍1 景点门口
CyclicBarrier barrier1 = new CyclicBarrier(2, barrier1Action);
//障碍2 山顶
CyclicBarrier barrier2 = new CyclicBarrier(2, barrier2Action);
//旅游计划,阶段目标一:景点门口集合
CyclicBarrierRunnable barrierRunnable1 =
new CyclicBarrierRunnable(barrier1, barrier2);
//旅游计划,阶段目标二:爬山到山顶集合
CyclicBarrierRunnable barrierRunnable2 =
new CyclicBarrierRunnable(barrier1, barrier2);
new Thread(barrierRunnable1).start(); //游客A,Thread-0
new Thread(barrierRunnable2).start(); //游客B,Thread-1
下面是一个线程类CyclicBarrierRunnable,启动一个就代表一个游客
public class CyclicBarrierRunnable implements Runnable{
CyclicBarrier barrier1 = null; //障碍1
CyclicBarrier barrier2 = null; //障碍2
public CyclicBarrierRunnable( CyclicBarrier barrier1,CyclicBarrier barrier2) {
this.barrier1 = barrier1;
this.barrier2 = barrier2;
}
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
![img](https://img-blog.csdnimg.cn/img_convert/932e3220ae2afed600d537dee52e783f.jpeg)
Docker步步实践
目录文档:
①Docker简介
②基本概念
③安装Docker
④使用镜像:
⑤操作容器:
⑥访问仓库:
⑦数据管理:
⑧使用网络:
⑨高级网络配置:
⑩安全:
⑪底层实现:
⑫其他项目:
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
vYJ-1713445001930)]
⑪底层实现:
[外链图片转存中…(img-exnqZlBm-1713445001932)]
⑫其他项目:
[外链图片转存中…(img-VBHL3oCz-1713445001933)]
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!