我从这个问题中获得了帮助
< Wait for all the threads to finish their job and then measure the time elapsed>
但是这个引用并没有解决我的问题。可能在某些方面我错了。
for (ReadProcess_MongoDB readData : readProcessMongoObj)
executor.execute((Runnable) readData);
executor.shutdown();
executor.awaitTermination(1, TimeUnit.MINUTES);
}
catch (InterruptedException e) {
//Log exception here
} finally {
executor.shutdownNow();
printTime();
}
public void printTime()
{
for(int i=0;i<numberOfThreads;i++)
System.err.println("used Time "+timeArrObj[i]);
}
系统打印这样的数据
线程数= 3 MongoDB_readQuery使用时间109
使用时间109
线程数= 0 MongoDB_readQuery使用时间109
使用时间109
使用时间0
使用时间0
使用时间0
线程数= 2 MongoDB_readQuery使用时间109
线程数= 4 MongoDB_readQuery使用时间109
线程数= 1 MongoDB_readQuery使用时间109
但我想要显示数据
线程数= 3 MongoDB_readQuery使用时间109
线程数= 0 MongoDB_readQuery使用时间109
线程数= 2 MongoDB_readQuery使用时间109
线程数= 4 MongoDB_readQuery使用时间109
线程数= 1 MongoDB_readQuery使用时间109
使用时间109
使用时间0
使用时间0
使用时间0
使用时间109
我希望在完成所有线程后执行printTime()。请指出我犯错的地方
答案 0 :(得分:-1)
由于打印输出时的线程交错而发生这种情况。我想提交给执行程序的任务不够长,无法阻止awaitTermination方法,执行程序立即关闭,后者又调用finally块中的printTime()方法。
在awaitTermination()方法调用之后添加Thread.sleep()可以提供延迟,可以获得您正在寻找的输出。
答案 1 :(得分:-1)
这里常见的解决方案之一是使用CountDownLatch。当然,只要你知道你有多少任务,它就能正常工作。 如果您不知道任务的数量,您可以尝试Phaser(感觉就像cpt.Kirk)。 这个解决方案更灵活。