2014-12-21 88 views
-1

我把幫助從這個問題我們如何確定線程池已完成所有工作?

< Wait for all the threads to finish their job and then measure the time elapsed>

但這refernce並沒有解決我的問題。可能我錯了,在一些點。

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
Thread Number = 2使用MongoDB_readQuery時間109
Thread Number = 4 MongoDB_readQuery使用時間109
Thread Number = 1 MongoDB_readQuery使用時間109

使用時間109
使用時間0
使用時間0
使用時間0
使用時間109

我想以後完成所有thread.Please建議執行printTime()我犯了錯誤

+0

你試過完成服務在你的參考中提到的傢伙?我沒有看到你的例子 – d0x

回答

-1

這是由於在打印輸出時線程交錯。我猜想提交給executor的任務不足以阻塞awaitTermination方法,執行程序立即獲取關閉狀態,然後在finally塊中調用printTime()方法。

在awaitTermination()方法調用之後添加Thread.sleep()可以提供一個延遲,它可以獲得您正在查找的輸出。

-1

這裏常見的解決方案之一是使用CountDownLatch。當然,只要你知道你有多少任務,它就能正常工作。 如果你不知道任務的數量你可以試試Phaser(感覺像ck。Kirk)。 該解決方案更加靈活。

相關問題