`

CyclicBarrier 测试用例

 
阅读更多
/**
 * 
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-JavaBase:Java一些类测试用例

    蓝桥杯leetcode 仓库内容是学习Java时所用的一些测试demo: 1. Cloneable ...CountDownLatch和CyclicBarrier区别 12. LanQiao 蓝桥杯的测试 13. LeetCode 在LeetCode刷的题 14. Test 一些偶尔的测试

    猎狗demo测试

    在描述中提到的"测试黑盒调用方法成功与否",意味着这个工具可能包含了各种测试用例,这些用例会模拟用户或者其他系统组件对目标方法的调用,并检查返回结果是否符合预期。黑盒测试的关键在于设计合适的输入,观察并...

    java并发测试

    通过编写和运行`MutiThreadTest.java`这样的测试用例,我们可以发现并解决潜在的并发问题,提升软件质量。同时,利用第三方库如`GroboUtils-5-core.jar`,可以简化并发编程和测试的复杂度,提高开发效率。

    一个简单的Java并发系统动态测试工具.zip

    `contest`可能是一个示例程序或测试用例,用于演示如何使用这个并发测试工具。 综上所述,Java并发系统动态测试工具结合了Java并发编程的各种概念和机制,通过实际的代码分析和测试,帮助开发者确保他们的并发程序...

    Android8.0 源代码(O)

    这份源码包含了一系列的目录和文件,涵盖了Android系统的各个方面,例如框架层、库、测试用例等。 1. **junit**: 这个目录包含了JUnit测试框架的源代码,JUnit是Java编程语言中广泛使用的单元测试工具。在Android ...

    Java 并发包下源码阅读与自己的测试

    - **竞争条件测试**:通过设计触发竞态条件的测试用例,确保并发安全。 - **死锁检测**:检查代码中是否存在可能导致死锁的情况,如`Thread.sleep()`和`wait()、notify()`的不当使用。 - **线程可见性和有序性**:...

    spring4+junit4.8 +多线程TheadTool

    Junit4.8则是Java单元测试的重要工具,它使得开发者可以方便地编写和执行测试用例,确保代码的正确性。而多线程在现代编程中扮演着关键角色,特别是在处理并发任务、提高系统效率时。 在"spring4+junit4.8 +多线程...

    java并发重构ppt_转温 少

    8. **并发测试**:如何编写测试用例来暴露并发问题,如使用`Thread.sleep()`模拟延迟,使用`@Test(expected = Exception.class)`注解捕获预期的异常。 9. **JVM内存模型和可见性**:理解Java内存模型(JMM)对并发...

    JVM调优的测试项目-JVM-subject.zip

    这个名为"JVM-subject-master"的项目,很可能是包含了一系列的测试用例、脚本和分析报告,用于模拟不同的工作负载,帮助开发者实践和理解上述的JVM调优知识点。通过深入研究和实践这个项目,可以提升我们的JVM调优...

    多线程的批量线程同步解决方案

    JUnit是Java中广泛使用的单元测试框架,它可以帮助开发者编写和运行针对线程同步的测试用例,确保代码的正确性和稳定性。通过编写并发测试,可以发现潜在的线程安全问题,如数据不一致、死锁等。 总之,多线程的...

    第四阶段第13天资料.zip

    学员会学习如何编写测试用例,确保代码质量。 7. **异常处理**:学习如何正确地捕获和处理异常,以及理解不同类型的异常,比如检查异常和运行时异常的区别。 8. **性能优化**:分析和优化代码性能,包括内存管理、...

    阿里巴巴Java开发手册v1.5.0华山版.zip

    - 测试用例应覆盖正常情况和异常情况,确保代码健壮性。 这份Java开发手册1.5版对上述知识点进行了详细阐述,是Java开发者提升编码素质的重要参考,值得每一位Java开发者深入学习和实践。通过遵循这些规范,可以...

    Java开发手册

    - 使用JUnit框架:编写可重复执行的测试用例,测试覆盖率尽可能高。 - 测试驱动开发(TDD):先写测试,再写代码,确保每个功能点都能通过测试。 以上只是《Java开发手册》的部分核心知识点,实际内容更为丰富,...

    阿里巴巴java规范

    测试用例应覆盖各种边界条件和异常情况,确保代码在各种场景下都能稳定运行。 此外,规范还涉及到了代码组织结构,提倡模块化设计,使代码结构清晰,易于扩展和维护。对于依赖管理,建议使用Maven或Gradle等构建...

    阿里巴巴规约17年-完整版

    1. 单元测试:每个方法都应有对应的单元测试用例,确保代码功能的正确性。测试覆盖率应达到一定标准。 2. 测试框架:利用JUnit、Mockito等测试框架编写可重复的、隔离的测试。 七、性能优化 1. 数据库优化:避免N+1...

    sync:同步测试

    为了有效地进行同步测试,开发者可以利用各种工具和技术,如Junit的`@Test`注解配合`@Rule`来创建线程安全的测试用例,或者使用Mockito等库来模拟并发场景。 在实际应用中,除了`synchronized`,Java还提供了多种...

    ElevatorSimulator_java_

    9. **测试**:为了确保模拟器的正确性,需要进行单元测试和集成测试,可以利用JUnit等测试框架编写测试用例。 通过创建电梯模拟器,开发者可以深入理解Java编程语言的高级特性,提升问题解决和软件设计能力。同时,...

    并发编程demo

    在`DisruptorSrcTest`中,你可以看到Disruptor的源码分析和测试用例,这对于理解其工作原理和优化并发性能非常有帮助。 其次,`Concurrent`可能指的是`java.util.concurrent`包下的一些并发工具类,如`...

    阿里Java开发手册(文档系列).zip

    9. **测试**:单元测试和集成测试是保证代码质量的重要手段,手册推荐使用JUnit等工具进行测试,强调编写可测试的代码,以及如何编写有效的测试用例。 10. **持续集成与自动化**:随着DevOps理念的普及,手册也涵盖...

    基于java的线程错误捕获工具 CheckThread.zip

    7. **单元测试与集成测试**: 通过编写针对多线程场景的测试用例,可以发现并预防潜在的线程安全问题。JUnit和TestNG等测试框架提供了异步测试支持,帮助开发者测试并发行为。 8. **ThreadLocal**: ThreadLocal变量...

Global site tag (gtag.js) - Google Analytics