2014-03-30 109 views
0

我希望幾乎所有使用ExecutorService運行線程的人都必須注意到這一點。但是我找不到解決這個問題的辦法。因此我在問。執行者服務:爲什麼程序永遠不會停止?

我下面的程序永遠不會停止。我已經等了5分鐘,但程序仍在運行。

當我添加executor.shutdown()時,程序停止。 雖然我知道shutdown()方法的作用,但我不確定是否需要調用此方法每次我們都使用EXECUTORSERVICE?

public class Latch implements Runnable{ 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     CountDownLatch latch = new CountDownLatch(3); 
     ExecutorService executor = Executors.newFixedThreadPool(10); 
     for(int i = 0; i < 3; i ++){ 
     executor.execute(new Latch(latch)); 
     } 
     try { 
      latch.await(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     System.out.println("STOPPED"); 
     executor.shutdown(); 
    } 

    CountDownLatch latch; 

    Latch(CountDownLatch latch){ 
     this.latch = latch; 
    } 

    @Override 
    public void run(){ 
     System.out.println("Thread Started"); 
     try { 
      Thread.sleep(3000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     latch.countDown(); 

    } 

} 
+0

一些可能的答案也在http://stackoverflow.com/a/22693393 – Marco13

+0

是給定的,我確實看到了那個。謝謝! – Roger

回答

2

Executors.newFixedThreadPool()狀態

在池中的線​​程的Javadoc將一直存在,直到它被明確shutdown

基本上是ExecutorService滋生一些非守護線程,它不會停止,直到你打電話shutdown()。直到所有非守護進程線程死亡,您的進程纔會結束。

因此,如果您需要您的應用程序結束或使用您自己的ThreadFactory,請調用它。下面是使用守護線程和改進的版本,一個線程池與儘可能多線程爲您的計算機的CPU內核:

Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors(), new ThreadFactory() 
{ 
    @Override 
    public Thread newThread(final Runnable r) { 
     Thread t = new Thread(r); 
     t.setDaemon(true); 
     return t; 
    } 
}); 
+0

謝謝。 我引用javadoc來了解newFixedThreadPool()如何工作,如果提交的任務數量大於Pool的大小。它還說明了你剛纔所說的內容。 – Roger

+0

我認爲一個標準的'ThreadPoolExecutor'(沒有重寫的方法,但設置了'allowCoreThreadTimeOut'標誌)作爲一個更優雅的解決方案,但我認爲當意圖是讓所有線程在應用程序退出後立即*結束*創建deamon線程也是一個可行的選擇,所以+1 – Marco13

相關問題