2010-11-17 211 views
11

我使用的是ScheduledExecutorService,在我調用它的shutdown方法後,我無法在其上安排Runnable。在shutdown()之後調用scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS)將拋出java.util.concurrent.RejectedExecutionException。在ScheduledExecutorService上調用shutdown()之後是否有另一種方法來運行新任務?ScheduledExecutorService啓動多次停止

+1

這是預期的行爲。你能解釋一下你正在做什麼以及爲什麼你想在關閉後執行另一個可運行的程序? – Jeremy 2010-11-17 14:38:39

回答

35

您可以重新使用調度程序,但不應該關閉它。而是取消調用scheduleAtFixedRate方法時可以獲得的正在運行的線程。例如:

//get reference to the future 
Future<?> future = service.scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS) 
//cancel instead of shutdown 
future.cancel(true); 
//schedule again (reuse) 
future = service.scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS) 
//shutdown when you don't need to reuse the service anymore 
service.shutdown() 
+1

我能夠在Spring環境中關閉並創建新服務,但是EJB讓我感到悲傷。這個伎倆,謝謝! – 2012-08-03 07:16:15

+0

@Alex在服務關閉之前,第一個未來對象不會釋放。當服務壽命長並且安排很多次時,這將會是內存泄漏。如果屬實,是否有避免內存泄漏的方法? – Nickolas 2013-10-09 11:35:50

+0

我錯了,取消的futureTask將不會被添加到workQueue中,所以它會被GC發佈。 – Nickolas 2013-10-09 13:07:14

5

shutdown()的javadoc說:

Initiates an orderly shutdown in which previously submitted tasks are executed, 
but no new tasks will be accepted. 

所以,你不能叫shutdow(),然後安排新的任務。

+0

有關如何在關機後重新安排新任務的建議? – walters 2010-11-18 09:33:50

+0

創建一個新的ScheduledExecutorService或不關閉現有的ScheduledExecutorService。你有沒有理由關閉它? – 2010-11-18 12:11:04

2

您不能讓執行程序在關閉它後接受新的任務。更相關的問題是爲什麼你需要首先關閉它?您創建的執行者應該在應用程序或子系統的整個生命週期中重新使用。