【问题标题】:How we can determined that thread pool has finish all jobs? [duplicate]我们如何确定线程池已完成所有工作? [复制]
【发布时间】:2014-12-21 18:30:39
【问题描述】:

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

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

【问题讨论】:

  • 您是否尝试过您参考中提到的那个人的完成服务?我在你的例子中没有看到它

标签: java multithreading threadpool


【解决方案1】:

这是由于打印输出时线程交错而发生的。我猜提交给 executor 的任务不足以阻止 awaitTermination 方法,并且 executor 立即关闭,这反过来又在 finally 块中调用 printTime() 方法。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      • 2011-10-25
      • 2017-09-12
      • 2016-05-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多