在
实际应用中,有时候需要多个线程同时工作以完成同一件事情,而且在完成过程中,往往会等待其他线程都完成某一阶段后再执行,等所有线程都到达某一个阶段后再统一执行。
比如有几个旅行团需要途经深圳、广州、韶关、长沙最后到达武汉。旅行团中有自驾游的,有徒步的,有乘坐旅游大巴的;这些旅行团同时出发,并且每到一个目的地,都要等待其他旅行团到达此地后再同时出发,直到都到达终点站武汉。
这时候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
分享到:
相关推荐
backport-util-concurrent库,正如其名,是一种将Java 5及以上版本的并发特性“回移植”到Java 1.4及更早版本的工具,使得开发者能在较旧的Java环境中享受现代并发编程的优势。本文将深入探讨这个库的2.2和3.1两个...
4. 并发工具:提供了一些新的并发工具类,如`java.util.concurrent`包下的`CountDownLatch`、`CyclicBarrier`和`Phaser`,这些工具帮助开发者更高效地管理多线程程序。 5. JDBC增强:JDBC API进行了扩展,增加了对...
"backport-util-concurrent-3.1.jar"是Java.util.concurrent包的回移植版本,主要用于Java 5之前的JRE环境。它提供了与Java 5及更高版本相同的并发工具类,如线程池、Future、CyclicBarrier等。这些工具可以提高多...
5. **并发工具类库**:Java并发工具包(java.util.concurrent)在1.6版本中得到加强,增加了如`CountDownLatch`、`CyclicBarrier`、`Semaphore`等同步工具,便于多线程编程。 6. **XPath和XML处理**:JDK 1.6改进了...
9. **并发编程改进(Concurrency Enhancements)**:引入了`java.util.concurrent`包,包含了许多线程安全的数据结构和并发工具类,如`Executor`框架、`Future`接口以及`Semaphore`、`CyclicBarrier`等同步工具。...
这个库使得开发者在不支持Java 5新特性的环境中也能使用高级的并发控制机制,极大地提升了多线程编程的效率和可靠性。本文将深入探讨backport-util-concurrent的源码,揭示其核心设计理念与实现原理。 首先,...
6. **并发改进**:对java.util.concurrent包进行了优化,包括改进的并发工具类,如CountDownLatch和CyclicBarrier,以及更高效的并发数据结构。 7. **编码改进**:增加了对编码格式的支持,比如对汉字和其他多字节...
Java并发编程包(java.util.concurrent,简称JUC)封装了大量用于高并发编程的工具类和接口,其中涉及了线程池、阻塞队列、同步器、原子操作类等。在并发环境下,可以有效降低线程创建和管理的复杂性。 #### Java...
JDK 1.6,也被称为Java SE 6,是Java平台标准版的一个重大更新,它在Java 1.5的基础上引入了许多新特性和改进。以下是一些关键知识点: 1. **增强的Swing组件**:JDK 1.6对Swing组件进行了优化,提供了更好的外观和...
- **java.concurrent**包引入了线程池、Future、Callable、CyclicBarrier等高级并发工具,提高了多线程编程的效率和可管理性。 3. **泛型**: JDK 1.5引入了泛型,允许在类、接口和方法中使用类型参数,提高了...
5. **并发工具(Concurrent Utilities)**:在java.util.concurrent包中添加了一系列的线程安全的集合和并发工具类,如Executor框架、Semaphore、CyclicBarrier等,为多线程编程提供了更好的支持。 6. **JMX(Java ...
7. **并发工具升级**:并发包`java.util.concurrent`中的工具类如CountDownLatch、CyclicBarrier等得到了增强,提升了多线程编程的效率。 8. **动态语言支持**:JDK 7引入了 invokedynamic 指令,为运行时绑定方法...
《初识Java 2:JDK 5版》是一本专为Java初学者设计的教程,旨在引导读者深入了解Java编程语言及其JDK 5版本的新特性。这本书详细讲解了Java的基础概念、语法以及开发环境的搭建,对于想要踏入Java世界的人来说,是不...
随着Java 1.5的发布,Sun公司(现在是Oracle公司的一部分)引入了`java.util.concurrent`包,这是一个革命性的进步,极大地简化了并发编程的工作,并增强了程序的稳定性和效率。通过`java.util.concurrent`提供的...
- **并发改进**:包括`java.util.concurrent`包中的新工具,如线程池、Future接口和CyclicBarrier,提升了多线程编程的效率和可管理性。 - **动态代理**:通过`java.lang.reflect.Proxy`类,开发者可以创建动态...
- 泛型是JDK 5引入的新特性,用于在编译时检查类型安全,减少类型转换的必要。 5. **Lambda表达式** - JDK 1.8引入的重要特性,简化了函数式接口的使用,使得代码更简洁、易读。 6. **Optional类** - 为了解决...
`java.util.concurrent`包中的Semaphore、CountDownLatch、CyclicBarrier等工具类,以及`java.lang.invoke.MethodHandles`和`java.lang.invoke.MethodHandle`,增强了并发编程的能力。 **八、 Nashorn JavaScript...
12. **并发工具类**:java.util.concurrent包中包含了许多高级并发工具,如ExecutorService、CountDownLatch、CyclicBarrier等,帮助开发者编写高效、线程安全的代码。 通过阅读和理解这个Java API文档,开发者可以...
3. **并发编程**:Java 1.8在`java.util.concurrent`包中提供了丰富的并发工具类,如`ExecutorService`、`Future`、`Semaphore`、`CyclicBarrier`等,以及`Fork/Join`框架,帮助开发者编写高效、安全的并发代码。...
11. **并发工具**:`java.util.concurrent`包提供了高级并发工具,如`Semaphore`,`CountDownLatch`,`CyclicBarrier`,`ThreadPoolExecutor`等,用于更有效和安全的多线程编程。 12. **国际化(i18n)**:`java....