2013-12-18 88 views
1

我正在編寫代碼,我需要確保在提交結果之前線程池中沒有線程正在運行(以避免丟失我應該提交的數據)。對於這一點,我使用:我如何知道ThreadPoolExecutor中的線程已完成?

while (_executor.getActiveCount() > 0) 
{ 
    try 
    { 
    Thread.sleep(10); // milliseconds 
    } 
    catch (InterruptedException e) 
    { 
    // OK do nothing 
    } 
} 

但同事回顧指出,getActiveCount商務部指出:

  • 返回正在積極
  • 執行的線程的大致數量任務。

那麼,有沒有危險,我會得到了while循環,同時還有在游泳池活動線程?如果是這樣,那麼等待我的所有工作線程完成的正確方法是什麼?

編輯:給更多的上下文:這是一個在線系統,其中包含執行程序服務的任務保持無限期運行。工作通過消息傳遞系統進入,放在執行程序中的一個線程中,不需要任何同步,工作就會進入消息傳遞系統的另一個隊列。我不想殺死執行者等待完成任務。

+0

你能等待的任務的執行,而不是等待執行是沒有工作? http://stackoverflow.com/questions/12896755/executorservice-with-invokeall-and-future-in-java – zapl

回答

0

要通知線程它應該清理並終止,請使用中斷方法。 t.interrupt();

這是很好的打印或從catch塊有你的錯誤日誌。

1

_executor.awaitTermination();應該做的工作。現在,它不會實際等待線程關閉,而是等待所有可用的任務終止。

你也可以提供keepAliveTime到一個線程池構造立即終止空閒線程:

ExecutorService executor = new ThreadPoolExecutor(0, 10, 0L /* keepAlive */, 
     TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); 
0

當任務提交給執行者,他們返回期貨,這表明他們完成。這是使用的首選機制。

您可以使用JDK ExecutorService shutdown/awaitTermination。

+0

Executor's ​​return void。爲了獲得'未來',你需要使用'CompletionService'。 – bstempi

+0

@bstempi'ExecutorService'返回'Future's和void。 'ExecutorService.submit'返回Runnables和Callables的期貨。 –

+0

JDK接口'ExecutorService' - 和所有實現類 - 絕對返回Futures。 – user2684301

0

用例:需要清理池線程完成時的線程局部線程,並且此清理可能需要很長時間(例如連接關閉)。只有在這之後主線程才能繼續。

工作者線程可以在某個集合中註冊自己。對於覆蓋start()run(),並通過自定義線程工廠ThreadPoolExecutor

class MyThreadFactory implements ThreadFactory { 

    @Override 
    public Thread newThread(final Runnable r) { 
     return new MyThread(r); 
    } 
... 

class Some { 
    void waitAllThreads() { 
     Thread worker; 
     while ((worker = workerThreads.poll()) != null) { 
      worker.join(); 
     } 
    } 
    ... 

class MyThread extends Thread { 

    @Override 
    public synchronized void start() { 
     if (getState() == State.NEW) { 
      some.workerThreads.offer(this); 
     } 
     super.start(); 
    } 

    @Override 
    public void run() { 
     try { 
      super.run(); 
     } finally { 
      some.workerThreads.remove(this); 
     } 
    } 

    ... 
相關問題