您的位置:首页 > 其它

多个线程同时开始启动计时框架的设计与实现

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;

调用方法:
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();

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐