在实际应用中,有时候需要多个线程同时工作以完成同一件事情,而且在完成过程中,往往会等待其他线程都完成某一阶段后再执行,等所有线程都到达某一个阶段后再统一执行。
比如有几个旅行团需要途经深圳、广州、韶关、长沙最后到达武汉。旅行团中有自驾游的,有徒步的,有乘坐旅游大巴的;这些旅行团同时出发,并且每到一个目的地,都要等待其他旅行团到达此地后再同时出发,直到都到达终点站武汉。
这时候CyclicBarrier就可以派上用场。CyclicBarrier最重要的属性就是参与者个数,另外最要方法是await()。当所有线程都调用了await()后,就表示这些线程都可以继续执行,否则就会等待。
package examples.ch06.example01;
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) {
Runnable runner = new Runnable() {
@Override
public void run() {
System.out.println("我们都到了");
}
};
// 三个旅行团
CyclicBarrier barrier = new CyclicBarrier(3,runner);
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();
}
}
16:46:28: SelfTour Reached Shenzhen
16:46:28: BusTour Reached Shenzhen
16:46:31: WalkTour Reached Shenzhen
我们都到了
16:46:34: SelfTour Reached Guangzhou
16:46:35: BusTour Reached Guangzhou
16:46:39: WalkTour Reached Guangzhou
我们都到了
16:46:43: SelfTour Reached Shaoguan
16:46:45: BusTour Reached Shaoguan
16:46:54: WalkTour Reached Shaoguan
我们都到了
上面这段代码也是网上copy的,Barrier的主要作用就是让所有运行Tour的线程执行到有barrier.await();代码的地方等待,当所有的线程都到达这个地点时,就运行runner线程里的代码。所以上面的例子如果运行起来的话,所有线程会在三个地点集体等待,在等待时,执行runner。
分享到:
相关推荐
- Java多线程编程涉及多个方面的知识和技术,从基本的线程创建到高级的同步机制,都是开发高效、可靠的多线程应用程序所必需的。 - 正确理解和使用这些技术对于提高程序性能、避免死锁等问题至关重要。
并发工具类则是Java中用于支持多线程协作和同步控制的一系列工具,它们可以简化并发控制逻辑,提高开发效率,并且减少因并发编程带来的错误。 #### 标题与描述解析 标题“并发编程——并发工具类.pdf”预示了文档...
Java作为一种强大的多线程编程语言,提供了丰富的API来支持进程同步。本篇文章将深入探讨如何使用Java实现“生产者-消费者”问题的进程同步。 生产者-消费者问题是多线程设计模式中的一个经典案例,它模拟了两个...
介绍Java并发编程中常用的集合框架,如ConcurrentHashMap、CopyOnWriteArrayList等,它们是如何在多线程环境下保证数据一致性与高效性的。 第五章:线程池 分析ExecutorService和ThreadPoolExecutor,解释如何配置...
4. **多线程** - **并发编程**:理解线程的基本概念,如何创建和管理线程,以及同步机制(如synchronized、volatile、Lock接口)的使用,是开发高并发应用的基础。 - **线程池**:ExecutorService和...
书中会详细介绍各种同步工具类,如`java.util.concurrent`包下的`Semaphore`信号量、`CyclicBarrier`回环屏障、`CountDownLatch`倒计时器以及`ExecutorService`和`Future`等。这些工具提供了更高级别的同步和协作...
线程同步是多线程编程中的重要概念,它主要用于解决多个线程并发访问共享资源时可能出现的竞争条件问题,确保数据的正确性和程序的稳定性。在Java等编程语言中,线程同步可以通过多种方式实现,本实例将探讨其中的几...
2. **多线程**:Java提供了强大的多线程支持,包括Thread类和Runnable接口。了解线程同步机制,如synchronized关键字、wait/notify机制、Lock锁、ReentrantLock等,以及并发工具类如ExecutorService、Semaphore、...
6. **多线程**:Java提供了丰富的多线程支持,如Thread类、Runnable接口、synchronized关键字、Lock接口等。面试中会考察线程同步、死锁、线程池的使用。 7. **IO流**:Java的IO系统是基于流的,包括字符流和字节流...
3. **多线程**: - **线程创建**:使用Thread类和Runnable接口创建线程。 - **同步机制**:synchronized、Lock、volatile关键字的应用及其原理。 - **并发工具类**:如Semaphore、CountDownLatch、CyclicBarrier...
3. **多线程**:掌握线程的创建方式(Thread类、Runnable接口)、线程同步机制(synchronized关键字、wait/notify、Lock接口及其实现类)、并发工具类(如CountDownLatch、CyclicBarrier、Semaphore)以及线程池...
这本书全面地介绍了如何在Java平台上高效、安全地编写多线程程序,帮助读者理解并解决并发编程中的各种挑战。 首先,我们需要理解“并发”这个概念。并发是指在一段时间内,多个任务可以同时进行或交替执行。在单...
3. **多线程** - 线程的创建方式:Thread类和Runnable接口,以及线程池的使用。 - 线程同步:synchronized关键字、volatile变量、Lock接口(如ReentrantLock)以及Condition。 - 死锁、活锁和饥饿现象的识别与...
在Java高级面试中,尤其是像蚂蚁金服这样的顶级科技公司,面试官通常会考察候选人在核心Java、并发处理、集合框架、多线程、垃圾回收、设计模式、数据库操作、网络编程、性能优化等多个领域的深入理解和应用能力。...
Java模拟快车下载器是一种利用Java编程语言实现的下载工具,它...通过这个项目,开发者不仅可以提升Java技术,还能深入了解网络通信和多线程编程。而"flashget"这个文件可能包含了示例代码或相关资源,供你参考和学习。
在Java高级面试中,面试官通常会关注应聘者对核心概念、并发处理、集合框架、设计模式、数据库操作、性能优化、垃圾收集以及框架应用等多个方面的理解和实践能力。以下是根据这些关键点展开的详细知识点: 1. **...
- **线程**:Java提供了Thread类和Runnable接口来实现多线程。线程间的同步和通信是面试常见问题,包括synchronized关键字、wait/notify机制、Lock接口等。 - **并发工具类**:如Semaphore(信号量),...
5. **多线程**:包括线程的基本概念、创建方式(继承Thread类、实现Runnable接口、使用ExecutorService)、线程同步(synchronized、Lock、信号量等)以及并发工具类(CountDownLatch、CyclicBarrier、Semaphore等)...
本书深入探讨了Java平台上的多线程编程技巧,并提供了大量实用案例来帮助读者理解如何有效地利用Java语言特性构建高效、可维护的多线程应用。 #### 二、并发基础 ##### 2.1 什么是线程安全? 线程安全是指在多线程...
1. 多线程:理解线程的创建方式,如实现Runnable接口和继承Thread类,线程同步和互斥方法,如synchronized、wait()、notify()等。 2. 内存模型:JVM内存结构,包括堆、栈、方法区、本地方法栈、程序计数器等。 3. 类...