我们如何确定线程池已完成所有工作?

时间:2014-12-21 18:30:39

标签: java multithreading threadpool

我从这个问题中获得了帮助

< 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()。请指出我犯错的地方

2 个答案:

答案 0 :(得分:-1)

由于打印输出时的线程交错而发生这种情况。我想提交给执行程序的任务不够长,无法阻止awaitTermination方法,执行程序立即关闭,后者又调用finally块中的printTime()方法。

在awaitTermination()方法调用之后添加Thread.sleep()可以提供延迟,可以获得您正在寻找的输出。

答案 1 :(得分:-1)

这里常见的解决方案之一是使用CountDownLatch。当然,只要你知道你有多少任务,它就能正常工作。 如果您不知道任务的数量,您可以尝试Phaser(感觉就像cpt.Kirk)。 这个解决方案更灵活。