多个线程同时开始启动计时框架的设计与实现
2015-04-17 16:41
435 查看
在DEMO测试中,我有个需求描述如下:线程A、B、C、D,我需要他们同时开始运行,并记录这四个线程全部完成所需要的时间。
这个借助synchronizer可轻松完成。这里我们使用CountDownLatch来实现,该方法的详细描述参见我的上篇博文:点击打开链接
核心代码如下:demo请参见github
/**
* @param args
* @throws InterruptedException
*/
private static long timer(Executor e,int concurrency,final Runnable action) throws InterruptedException{
final CountDownLatch ready = new CountDownLatch(concurrency);
final CountDownLatch start = new CountDownLatch(1);
final CountDownLatch end = new CountDownLatch(concurrency);
//将线程同时启动并处于wait状态,知道start.await因为countDown=0被启动
for(int i=0;i<concurrency;i++){
e.execute(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
ready.countDown();
try {
start.await();
System.out.print(Thread.currentThread().getId()+"ready\n");
action.run();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Thread.currentThread().interrupt();
}finally{
System.out.print(Thread.currentThread().getId()+"end\n");
end.countDown();
}
}
});
}
ready.await();
start.countDown();
long startTime = System.nanoTime();
end.await();
return System.nanoTime()-startTime;
调用方法:
这个借助synchronizer可轻松完成。这里我们使用CountDownLatch来实现,该方法的详细描述参见我的上篇博文:点击打开链接
核心代码如下:demo请参见github
/**
* @param args
* @throws InterruptedException
*/
private static long timer(Executor e,int concurrency,final Runnable action) throws InterruptedException{
final CountDownLatch ready = new CountDownLatch(concurrency);
final CountDownLatch start = new CountDownLatch(1);
final CountDownLatch end = new CountDownLatch(concurrency);
//将线程同时启动并处于wait状态,知道start.await因为countDown=0被启动
for(int i=0;i<concurrency;i++){
e.execute(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
ready.countDown();
try {
start.await();
System.out.print(Thread.currentThread().getId()+"ready\n");
action.run();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Thread.currentThread().interrupt();
}finally{
System.out.print(Thread.currentThread().getId()+"end\n");
end.countDown();
}
}
});
}
ready.await();
start.countDown();
long startTime = System.nanoTime();
end.await();
return System.nanoTime()-startTime;
调用方法:
public static void main(String[] args) { // TODO Auto-generated method stub i = new AtomicInteger(); ExecutorService e = Executors.newFixedThreadPool(5); Runnable action = new Runnable(){ @Override public void run() { // TODO Auto-generated method stub try { //System.out.print(i.get()+"\n"); TimeUnit.SECONDS.sleep(i.getAndAdd(5)); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; try { long time = timer(e, 4, action); System.out.println(time); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } e.shutdown(); }
相关文章推荐
- 写书计划启动!《.NET通信框架的设计、实现与应用》
- android surfaceview 双线程实现计时的同时 可以随意移动滑块
- 用三个独立按键实现按下第一个时计时停止,按下第二个时计时开始,按下第三个时计数值清零从头开始,秒表设计!!!!
- 一个通用的单元测试框架的思考和设计05-实现篇-Guice框架启动与自动注入
- 两个线程A和B,任务都是打印当前时间,要求编码实现:线程A和B同时启动后,以先A后B的方式任务交叉执行10次。
- 一个通用的单元测试框架的思考和设计05-实现篇-Guice框架启动与自动注入
- 两个线程A和B,任务都是打印当前时间,要求编码实现:线程A和B同时启动后,以先A后B的方式任务交叉执行10次。
- 优雅设计封装基于Okhttp3的网络框架(三):多线程下载功能核心实现 及 线程池、队列机制、终止线程解析
- Java+Selenium3框架设计准备篇2-TestNG通过变量实现启动不同浏览器测试
- 【CountDownLatch】实现多个线程同时启动
- 应用框架的设计与实现——.NET平台(8.1 Windows服务.线程)
- Netty学习之旅------线程模型前置篇Reactor反应堆设计模式实现(基于java.nio)
- 基于asp.net + easyui框架,js实现上传图片之前判断图片格式,同时实现预览,兼容各种浏览器+下载
- Java日志系统框架的设计与实现
- SSH物流开发系统设计:搭建框架并实现登录
- 基于元数据配置的asp.net数据库应用快速开发框架设计及实现
- 关键字驱动框架入门教程-3-识别并设计实现动作关键字
- C++实现线程同步的几种方式 线程同步是指同一进程中的多个线程互相协调工作从而达到一致性。之所以需要线程同步,是因为多个线程同时对一个数据对象进行修改操作时,可能会对数据造成破坏,下面是多
- 一种Java日志系统框架的设计与实现(转)
- js架构设计模式——前端MVVM框架设计及实现(二)