2013-01-03 59 views
0

我懷疑java.util.concurrent.ExecutorService是否應在所有任務完成或取消後關閉?java.util.concurrent.ExecutorService應該以java.sql.Connection的形式關閉嗎?

我有這樣的方法:

public void testProxies() { 

    // 5 thread 
    ExecutorService exec = Executors.newFixedThreadPool(5); 

    try { 
     while(condition){ 
      exec.execute(new Runnable() { 
       @Override 
       public void run() { 
        //some task 
       } 
      }); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     exec.shutdown();// should be shutdown here? 
    } 
} 

是,使用ExecutorService的當期的方式嗎?

如何重複使用ExecutorService

ExecutorService應該關機還是放手吧?

回答

1
  • 如果關閉它,則無法重複使用。
  • 如果你沒有關閉它,你的程序將不能退出,因爲會有非守護進程線程。

所以你需要在某個階段調用shutdown讓你的程序退出,但只有當你知道你不需要向執行器提交額外的任務。

我一般做:

  • 我做的ExecutorService我的類的字段
  • 我提供了一個stopshutdown方法,我的類的用戶需要調用它調用的關機方法遺囑執行人。請注意,在所有提交的任務完成(或已被成功取消)之前,執行程序不會實際關閉。

另一種方法是添加一個關閉掛鉤,當JVM退出時它會關閉您的執行程序。

+1

我不完全同意你的看法。即使執行程序中有任務正在運行,如果調用System.exit(),程序仍然會退出。當執行器不再需要時,也應該調用shutdown方法,並且它不應該接受更多的任務(這並不意味着如果有正在運行的任務,它們將被終止並且你的程序將很好地退出)。 –

+0

@AlexCalugarescu那不是我說的。即使執行程序未關閉,System.exit()也會終止程序,但如果關閉執行程序,則程序可以不需要System.exit()調用就終止。 – assylias

+0

@AlexCalugarescu我同意關機不會取消正在運行的任務(shutdownNow) - 但我並沒有暗示這一點。 – assylias

1

是的。如果您不想執行任何任務,則應關閉ExecutorService。

+0

但是,我如何重用它? – lichengwu

+0

如果你關機,你不能重複使用,如果你想重新使用,你可以在沒有關機的情況下提交你的代碼。 – kosa