/**
*
CyclicBarrier介绍
一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarrier 支持一个可选的 Runnable 命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。
主要方法:
Java代码
.//设置parties、count及barrierCommand属性。
.CyclicBarrier(int):
.
4.//当await的数量到达了设定的数量后,首先执行该Runnable对象。
5.CyclicBarrier(int,Runnable):
//通知barrier已完成线程
await():
应用场景
在某种需求中,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择CyclicBarrier了。
:
*
* 在实际应用中,有时候需要多个线程同时工作以完成同一件事情,而且在完成过程中,往往会等待其他线程都完成某一阶段后再执行,
* 等所有线程都到达某一个阶段后再统一执行。
*
* 比如有几个旅行团需要途经深圳、广州、韶关、长沙最后到达武汉。旅行团中有自驾游的,有徒步的,有乘坐旅游大巴的;这些旅行团同时出发,并且每到一个目的地,
* 都要等待其他旅行团到达此地后再同时出发,直到都到达终点站武汉。
*
* 这时候CyclicBarrier就可以派上用场。CyclicBarrier最重要的属性就是参与者个数,另外最要方法是await()。
* 当所有线程都调用了await()后,就表示这些线程都可以继续执行,否则就会等待。
*
*/
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(); //等待 ,等到 awite的数量 为3的时候 执行
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();
}
}
分享到:
相关推荐
蓝桥杯leetcode 仓库内容是学习Java时所用的一些测试demo: 1. Cloneable ...CountDownLatch和CyclicBarrier区别 12. LanQiao 蓝桥杯的测试 13. LeetCode 在LeetCode刷的题 14. Test 一些偶尔的测试
在描述中提到的"测试黑盒调用方法成功与否",意味着这个工具可能包含了各种测试用例,这些用例会模拟用户或者其他系统组件对目标方法的调用,并检查返回结果是否符合预期。黑盒测试的关键在于设计合适的输入,观察并...
通过编写和运行`MutiThreadTest.java`这样的测试用例,我们可以发现并解决潜在的并发问题,提升软件质量。同时,利用第三方库如`GroboUtils-5-core.jar`,可以简化并发编程和测试的复杂度,提高开发效率。
`contest`可能是一个示例程序或测试用例,用于演示如何使用这个并发测试工具。 综上所述,Java并发系统动态测试工具结合了Java并发编程的各种概念和机制,通过实际的代码分析和测试,帮助开发者确保他们的并发程序...
这份源码包含了一系列的目录和文件,涵盖了Android系统的各个方面,例如框架层、库、测试用例等。 1. **junit**: 这个目录包含了JUnit测试框架的源代码,JUnit是Java编程语言中广泛使用的单元测试工具。在Android ...
- **竞争条件测试**:通过设计触发竞态条件的测试用例,确保并发安全。 - **死锁检测**:检查代码中是否存在可能导致死锁的情况,如`Thread.sleep()`和`wait()、notify()`的不当使用。 - **线程可见性和有序性**:...
Junit4.8则是Java单元测试的重要工具,它使得开发者可以方便地编写和执行测试用例,确保代码的正确性。而多线程在现代编程中扮演着关键角色,特别是在处理并发任务、提高系统效率时。 在"spring4+junit4.8 +多线程...
8. **并发测试**:如何编写测试用例来暴露并发问题,如使用`Thread.sleep()`模拟延迟,使用`@Test(expected = Exception.class)`注解捕获预期的异常。 9. **JVM内存模型和可见性**:理解Java内存模型(JMM)对并发...
这个名为"JVM-subject-master"的项目,很可能是包含了一系列的测试用例、脚本和分析报告,用于模拟不同的工作负载,帮助开发者实践和理解上述的JVM调优知识点。通过深入研究和实践这个项目,可以提升我们的JVM调优...
JUnit是Java中广泛使用的单元测试框架,它可以帮助开发者编写和运行针对线程同步的测试用例,确保代码的正确性和稳定性。通过编写并发测试,可以发现潜在的线程安全问题,如数据不一致、死锁等。 总之,多线程的...
学员会学习如何编写测试用例,确保代码质量。 7. **异常处理**:学习如何正确地捕获和处理异常,以及理解不同类型的异常,比如检查异常和运行时异常的区别。 8. **性能优化**:分析和优化代码性能,包括内存管理、...
- 测试用例应覆盖正常情况和异常情况,确保代码健壮性。 这份Java开发手册1.5版对上述知识点进行了详细阐述,是Java开发者提升编码素质的重要参考,值得每一位Java开发者深入学习和实践。通过遵循这些规范,可以...
- 使用JUnit框架:编写可重复执行的测试用例,测试覆盖率尽可能高。 - 测试驱动开发(TDD):先写测试,再写代码,确保每个功能点都能通过测试。 以上只是《Java开发手册》的部分核心知识点,实际内容更为丰富,...
测试用例应覆盖各种边界条件和异常情况,确保代码在各种场景下都能稳定运行。 此外,规范还涉及到了代码组织结构,提倡模块化设计,使代码结构清晰,易于扩展和维护。对于依赖管理,建议使用Maven或Gradle等构建...
1. 单元测试:每个方法都应有对应的单元测试用例,确保代码功能的正确性。测试覆盖率应达到一定标准。 2. 测试框架:利用JUnit、Mockito等测试框架编写可重复的、隔离的测试。 七、性能优化 1. 数据库优化:避免N+1...
为了有效地进行同步测试,开发者可以利用各种工具和技术,如Junit的`@Test`注解配合`@Rule`来创建线程安全的测试用例,或者使用Mockito等库来模拟并发场景。 在实际应用中,除了`synchronized`,Java还提供了多种...
9. **测试**:为了确保模拟器的正确性,需要进行单元测试和集成测试,可以利用JUnit等测试框架编写测试用例。 通过创建电梯模拟器,开发者可以深入理解Java编程语言的高级特性,提升问题解决和软件设计能力。同时,...
在`DisruptorSrcTest`中,你可以看到Disruptor的源码分析和测试用例,这对于理解其工作原理和优化并发性能非常有帮助。 其次,`Concurrent`可能指的是`java.util.concurrent`包下的一些并发工具类,如`...
9. **测试**:单元测试和集成测试是保证代码质量的重要手段,手册推荐使用JUnit等工具进行测试,强调编写可测试的代码,以及如何编写有效的测试用例。 10. **持续集成与自动化**:随着DevOps理念的普及,手册也涵盖...
7. **单元测试与集成测试**: 通过编写针对多线程场景的测试用例,可以发现并预防潜在的线程安全问题。JUnit和TestNG等测试框架提供了异步测试支持,帮助开发者测试并发行为。 8. **ThreadLocal**: ThreadLocal变量...