2013-08-22 80 views
0
if (isDownloadLogRequired) { 
     ExecutorService pool = Executors.newFixedThreadPool(THREAD_POOL_SIZE); 
     for (HostGenericServiceTicket hostGenericServiceTicket : hostGenericServiceTickets) { 
      pool.submit(new DiagnosticLogDownloader(logNames, downloadTo, hostGenericServiceTicket)); 
     } 
     pool.shutdown(); 
     try { 
      pool.awaitTermination(downloadTimeout, TimeUnit.SECONDS); 
     } catch (InterruptedException e) { 
      System.err.println(MessageFormat.format("{0}: Reason: {1}", e.getClass() 
        .getSimpleName(), e.getMessage())); 
     } 
    } 

如果downloadTimeout設置爲180秒線程應該被終止並且程序應該正確結束?await在線程池終結並不會終止線程池

回答

4

否。超時時間是您想要等待多少時間。線程池將在執行完所有任務後終止。

如果調用shutdown(),線程池不會排隊新的作業(但它不會阻止正在運行的作業,並且會運行已排入隊列的作業)。

如果你調用shutdownNow(),它不會啓動任何新的工作,並會向工作線程發送一箇中斷。如果您的Runnable正確檢查中斷並自動終止,則池將快速停止。否則,它相當於shutdown()

在Java中,沒有辦法強制終止一個線程(Thread.stop()已被棄用,因爲它是資源泄漏和死鎖傾向)。您只能要求線程終止(調用其interrupt()方法),但取決於您的代碼定期檢查Thread.interrupted()並正確使用InterruptedException s。

禮貌工人的一個例子是這樣的:

public class PoliteWorker implements Runnable { 
    private boolean successful = false; 
    public void run() { 
     while (...) { 
      if (Thread.interrupted()) { 
       myLogger.log(Level.INFO, "Thread was interrupted. Aborting..."); 
       return; 
      } 
      ... 
      try { 
       String line = myInput.readLine(); 
      } catch (InterruptedIOException ex) { 
       //Must terminate 
       myLogger.log(Level.INFO, "Thread was interrupted. Aborting...", ex); 
       return; 
      } catch (IOException ex) { 
       //handle other exceptions 
      } 
     } 
     successful = true; 
    } 
} 
+0

不過,爲什麼是這個樣子這個API的說明? - 布爾awaitTermination(長超時, TIMEUNIT單元) 拋出InterruptedException的 \t阻塞,直到所有任務已經完成了關機請求之後執行,或在超時 \t發生時,或當前線程中斷,無論哪個首先發生。 – Manav

+0

是的,這正是我所說的「以先發生者爲準」。它實際上並沒有做任何事情來終止線程。 –

+0

那麼程序應該在超時之後向前移動,並且結束正確的時間?......它應該只阻止超時量秒,然後應該向前移動......並且當程序死亡時,所有線程都應該死掉。 。我的意思是,在我的情況下,超時發生在第一位......所以代碼在這次調用中沒有更多的阻止,並向前移動? – Manav