在
实际应用中,有时候需要多个线程同时工作以完成同一件事情,而且在完成过程中,往往会等待其他线程都完成某一阶段后再执行,等所有线程都到达某一个阶段后再统一执行。
比如有几个旅行团需要途经深圳、广州、韶关、长沙最后到达武汉。旅行团中有自驾游的,有徒步的,有乘坐旅游大巴的;这些旅行团同时出发,并且每到一个目的地,都要等待其他旅行团到达此地后再同时出发,直到都到达终点站武汉。
这时候CyclicBarrier
就可以派上用场。CyclicBarrier最重要的属性就是参与者个数,另外最要方法是await()。当所有线程都调用了await()后,就表示这些线程都可以继续执行,否则就会等待。
package
concurrent;
import
java.text.SimpleDateFormat;
import
java.util.Date;
import
java.util.concurrent.BrokenBarrierException;
import
java.util.concurrent.CyclicBarrier;
import
java.util.concurrent.ExecutorService;
import
java.util.concurrent.Executors;
public class
TestCyclicBarrier
{
// 徒步需要的时间: Shenzhen, Guangzhou, Shaoguan, Changsha, Wuhan
private static
int
[]
timeWalk =
{
5
,
8
,
15
,
15
,
10
}
;
// 自驾游
private static
int
[]
timeSelf =
{
1
,
3
,
4
,
4
,
5
}
;
// 旅游大巴
private static
int
[]
timeBus =
{
2
,
4
,
6
,
6
,
7
}
;
static
String now
() {
SimpleDateFormat sdf =
new
SimpleDateFormat
(
"HH:mm:ss"
)
;
return
sdf.format
(
new
Date
())
+
": "
;
}
static class
Tour
implements
Runnable
{
private
int
[]
times;
private
CyclicBarrier barrier;
private
String tourName;
public
Tour
(
CyclicBarrier barrier, String tourName,
int
[]
times
) {
this
.times = times;
this
.tourName = tourName;
this
.barrier = barrier;
}
public
void
run
() {
try
{
Thread.sleep
(
times
[
0
]
*
1000
)
;
System.out.println
(
now
()
+ tourName +
" Reached Shenzhen"
)
;
barrier.await
()
;
Thread.sleep
(
times
[
1
]
*
1000
)
;
System.out.println
(
now
()
+ tourName +
" Reached Guangzhou"
)
;
barrier.await
()
;
Thread.sleep
(
times
[
2
]
*
1000
)
;
System.out.println
(
now
()
+ tourName +
" Reached Shaoguan"
)
;
barrier.await
()
;
Thread.sleep
(
times
[
3
]
*
1000
)
;
System.out.println
(
now
()
+ tourName +
" Reached Changsha"
)
;
barrier.await
()
;
Thread.sleep
(
times
[
4
]
*
1000
)
;
System.out.println
(
now
()
+ tourName +
" Reached Wuhan"
)
;
barrier.await
()
;
}
catch
(
InterruptedException e
) {
}
catch
(
BrokenBarrierException e
) {
}
}
}
public static
void
main
(
String
[]
args
) {
// 三个旅行团
CyclicBarrier barrier =
new
CyclicBarrier
(
3
)
;
ExecutorService exec = Executors.newFixedThreadPool
(
3
)
;
exec.submit
(
new
Tour
(
barrier,
"WalkTour"
, timeWalk
))
;
exec.submit
(
new
Tour
(
barrier,
"SelfTour"
, timeSelf
))
;
exec.submit
(
new
Tour
(
barrier,
"BusTour"
, timeBus
))
;
exec.shutdown
()
;
}
}
|
运行结果:
00:02:25: SelfTour Reached Shenzhen
00:02:25: BusTour Reached Shenzhen
00:02:27: WalkTour Reached Shenzhen
00:02:30: SelfTour Reached Guangzhou
00:02:31: BusTour Reached Guangzhou
00:02:35: WalkTour Reached Guangzhou
00:02:39: SelfTour Reached Shaoguan
00:02:41: BusTour Reached Shaoguan
分享到:
相关推荐
jdk-8u202-linux-arm64-vfp-hflt.tar.gz适用于Linux ARM v6/v7 Soft Float ABI 64位系统,是在Binary Code License (“BCL”)许可协议下提供最后的免费商业版本,允许用在生产环境中; 对于 2019 年 4 月 16 日开始...
jdk 17需要 新增 配置 如下 jvm参数 --add-opens=java.base/jdk.internal.org.objectweb.asm=ALL-UNNAMED --add-opens=java.base/jdk.internal.org.objectweb.asm.tree=ALL-UNNAMED
合适研究底层研发员,但,一般程序员也必须掌握的要点 JDK研究系列--》util.concurrent(java.util part3)
jdk-8u241-linux-arm64-vfp-hflt.tar.gz 64位的ArmLinux系统java jdk
64位的jdk安装文件,Java-version-1.8.0_45版本,可以直接下载。
java-jdk1.8-8u361-all-jdk-win-linux 该压缩包中包含jdk1.8-8u361下windows版本和linux版本,其包含快速安装包和对应的jdk压缩包版本,具体内容如下: jdk-8u361-linux-aarch64.rpm jdk-8u361-linux-i586.rpm jdk-8...
Centos7离线安装文件 jdk-8u231-linux-x64.tar.gz压缩包 免费下载,现在博客都是付费文件,搞得头大,现在免费分享
1.下载后重命名:jdk-8u281-linux-x64.tar.gz 2.解压 tar -zxvf jdk-8u281-linux-x64.tar.gz 3.配置环境变量:vim /etc/profile 最后添加: export JAVA_HOME=/opt/jdk export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$...
jdk-8u111-linux-arm64-vfp-hflt.tar.gz
标签:bouncycastle、bcmail、jdk14、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译...
jdk-8u151-linux-arm64-vfp-hflt.tar.gz.................................................................................................
jdk-8u202-linux-arm64-vfp-hflt.tar.gz,Oracle-jdk8,JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和...
最新版linux jdk-8u371-linux-x64.tar.zip最新版linux jdk-8u371-linux-x64.tar.zip最新版linux jdk-8u371-linux-x64.tar.zip
常用Linux服务器环境的JDK jdk-8u121-linux-x64.tar.gz文件在Linux_JDK8内,请解压之后使用,如果无法下载请留言!
jdk-8u231-linux-x64.tar.gz JDK for linux x64 tar.gz 大小:185.16 MB sha256: a011584a2c9378bf70c6903ef5fbf101b30b08937441dc2ec67932fb3620b2cf md5: c1fef2e714be761773ee0fc2be5dd78e
arm架构的1.7jdk,在树莓派4B上可以应用<jdk-7u51-linux-arm-vfp-hflt.gz>
压缩包内容: Java SE Development ...(3)jdk-8u301-linux-arm32-vfp-hflt.tar.gz (4)jdk-8u301-linux-i586.rpm (5)jdk-8u301-linux-i586.tar.gz (6)jdk-8u301-linux-x64.rpm (7)jdk-8u301-linux-x64.tar.gz
官方 jdk1.8 jdk-8u213-linux-arm64-vfp-hflt.tar.zip
Linux下arm_64平台jdk安装包,oracle版本的源码包,包含jre。有需要的小伙伴下载吧。