2010-11-17 8 views
11

Ich benutze ScheduledExecutorService, und nachdem ich es shutdown Methode aufrufen, kann ich keine Runnable darauf planen. Der Aufruf von scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS) nach shutdown() löst java.util.concurrent.RejectedExecutionException aus. Gibt es eine andere Möglichkeit, eine neue Aufgabe auszuführen, nachdem shutdown() unter ScheduledExecutorService aufgerufen wurde?ScheduledExecutorService Start Stop mehrmals

+1

Das ist das erwartete Verhalten. Können Sie erklären, was Sie zu tun versuchen und warum Sie nach dem Herunterfahren ein anderes Runnable ausführen möchten? – Jeremy

Antwort

35

Sie können den Scheduler wiederverwenden, aber Sie sollten ihn nicht beenden. Brechen Sie stattdessen den laufenden Thread ab, den Sie beim Aufruf der Methode scheduleAtFixedRate erhalten. Beispiel:

+1

Ich konnte herunterfahren und neue Dienste in einer Spring-Umgebung erstellen, aber EJBs gaben mir Trauer. Das hat den Trick gemacht, danke! –

+0

@Alex Das erste zukünftige Objekt wird erst freigegeben, wenn der Dienst heruntergefahren wird. Es wird ein Speicherleck sein, wenn der Dienst lange dauert und viele Male geplant wird. Wenn es wahr ist, gibt es eine Möglichkeit, Speicherlecks zu vermeiden? – Nickolas

+0

Ich bin falsch, die abgebrochene futureTask wird nicht zu workQueue hinzugefügt, daher wird sie von GC veröffentlicht. – Nickolas

5

Die javadocs von shutdown() sagen:

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

Also, Sie nicht shutdow() anrufen und dann neue Aufgaben planen.

+0

Haben Sie Vorschläge, wie Sie neue Aufgaben nach dem Herunterfahren neu planen können? – walters

+0

Erstellen Sie entweder einen neuen ScheduledExecutorService oder beenden Sie den vorhandenen nicht. Gibt es einen Grund, warum Sie es schließen? –

2

Sie können Ihren Executor nicht dazu bringen, neue Tasks anzunehmen, nachdem Sie ihn heruntergefahren haben. Die relevantere Frage ist, warum Sie es zuerst herunterfahren müssen? Die von Ihnen erstellten Executors sollten während der gesamten Lebensdauer Ihrer Anwendung oder Ihres Subsystems wiederverwendet werden.