ExecutorService sauber stoppen

F

fuchs005

Gast
Hallo Java-Freunde,

ich möchte gerne einen Thread-Pool realisieren, habe aber noch nie mit dem ExecutorService gearbeitet und bräuchte mal eure Hilfe.

Ich habe eine ArrayList<T> mit einer Menge von T-Objekten, die Runnable implementieren. Dann starte ich den Pool

Java:
ExecutorService pool = Executors.newFixedThreadPool(5);
for (T t : tList) {
    pool.execute(t);
}

Das klappt so weit gut, nun brauche ich aber eine Möglichkeit, den Thread-Pool auch wieder zu stoppen. Und zwar möchte ich gerne die aktuell laufenden Threads (die aktuell verarbeiteten T-Objekte) zu ende laufen lassen (mit einem Timeout, so dass sie nach Ablauf abgebrochen werden) und alle wartenden Threads (T-Objekte) in der Queue nicht mehr bearbeitet werden.

Durch Aufrufen von
Code:
pool.shutdown();
wird der Pool zwar beendet, allerdings erst nach dem alle T-Objekte verarbeitet wurden. Durch Aufruf von
Code:
pool.shutdownNow();
wird der Pool sofort beendet, ohne die aktuellen Threads zu ende laufen zu lassen.

Wie kann ich das wie oben beschrieben realisieren?

Danke für eure Hilfe!
 
G

Gast2

Gast
Du könntest eine Mischung aus
Code:
shutdown
,
Code:
awaitTermination
und
Code:
shutdownNow
ausprobieren, so in der Art:

Java:
pool.shutdown();
try {
  boolean allThreadsStopped = pool.awaitTermination(10, TimeUnit.SECOND);
  if (!allThreadsStopped) {
    pool.suhtdownNow(); // noch laufende Threads abwürgen
  }
} catch (InterruptedException ie) {/* Exception behandeln */}
Hab sowas aber selbst noch nie ausprobiert, laut Doku müsste das aber so ungefähr funktionieren.
 

Michael...

Top Contributor
Habe ebenfalls noch nie mit ExecutorService gearbeitet.
Denkbar wäre, dass die Runnables beim Start ein Flag überprüfen und ggf. die run() gleich wieder beenden. Zeitgleich zum Aufruf von
Code:
pool.shutdown();
müsste dieses Flag auf false gesetzt werden.
 

Marco13

Top Contributor
Nur ein Gedanke: Die Factory-Methode macht intern
Java:
 public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
    }
Vielleicht (!) kann man dort eine BlockingQueue erstellen, die man vor dem Shutdown mit drainTo(new ArrayList()) leert? (OB das funktioniert, weiß ich nicht, aber es wäre eine Überlegung wert)
 
S

SlaterB

Gast
das kann bös ins Auge gehen mit ConcurrentModificationException usw.,
lieber die zu übergebenen Objekte, falls etwa nicht unter direkter Kontrolle, durch eine eigene Klasse wrappen,
die entweder die eigene run-Methode sofort beendet oder die eigentliche run-Methode aufruft
 

Marco13

Top Contributor
Zumindest steht in der Doku: "BlockingQueue implementations are thread-safe.", also sollte das ggf. kein Problem sein - aber ob es wirklich funktioniert, muss man sich genauer ansehen (es wäre eben ein sehr einfacher Weg, das beschriebene Verhalten zu erreichen)
 
F

fuchs005

Gast
Danke für die vielen (schnellen) Antworten!

Das Beispiel in der Doku mit shutdown, awaitTermination und shutdownNow habe ich auch direkt ausprobiert. Damit laufen die aktuellen Threads zu ende, allerdings werden trotzdem die nächsten begonnen und dann durch shutdownNow abgewürgt. Das führt dann zu einem inkonsistenten Zustand meiner Objekte, was ich natürlich unbedingt vermeiden will.

Die Idee mit dem Flag finde ich nicht schlecht, ich werde mal sehen ob sich da was sinnvolles implementieren lässt.

Ansonsten bin ich auch gerne für weitere Ideen offen ;-)

Danke und Gruß
 

Empire Phoenix

Top Contributor
Die queue hat nen clear befehl, clear auf die queue (Der executor pop't sich seine tasks ja da ab, also sind die unbetroffen), weitere runnables verweigern bei der annahme (flag überprüfen)
 
F

fuchs005

Gast
Danke für alle Vorschläge.

Ich habs jetzt über ein Flag gelöst, dass ich vor dem pool.shutdown() bei allen Objekten in meiner Liste setze. Das Falg überprüfe ich dann in der run() Mehtode. Dadurch wird zwar nach dem Aufruf von shutdown() noch jedes Element der Liste durchlaufen, aber damit kann ich leben.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F ExecutorService richtig anwenden Allgemeine Java-Themen 0
M ExecutorService, fängt nicht an Allgemeine Java-Themen 1
S ExecutorService.invokeAll -- was passiert wenn einige Tasks schon ausgefuehrt wurden? Allgemeine Java-Themen 2
K Parallel programmieren mit ExecutorService Allgemeine Java-Themen 41
M callable in ExecutorService killen? Allgemeine Java-Themen 14
C Threads ExecutorService shutdown abbrechen und service "starten" ? Allgemeine Java-Themen 3
S ExecutorService Frage (concurrent Threads) Allgemeine Java-Themen 4
D Thread.setUncaughtExceptionHandler() für ExecutorService Allgemeine Java-Themen 4
C JProgressbar an ExecutorService koppeln Allgemeine Java-Themen 5
O Unterschied zwischen Semaphoren/Lock und ExecutorService Allgemeine Java-Themen 3
T Testing JUnit5: try ... catch arbeitet nicht sauber Allgemeine Java-Themen 6
T Java Programm sauber beenden (Mac OS) Allgemeine Java-Themen 7
I Über eine Liste iterieren und Objekte löschen. Wie löst man das sauber? Allgemeine Java-Themen 5
K sauber und schön programmieren Allgemeine Java-Themen 2
V Endlosschleife mit Startbutton starten und Stopbutton stoppen Allgemeine Java-Themen 6
E Exceptions abfangen und dann Programm stoppen - aber wie? Allgemeine Java-Themen 2
V Thread schneller stoppen Allgemeine Java-Themen 2
G mehrere Threads starten/stoppen Allgemeine Java-Themen 4
O JFreeChart: ständiges Updaten der Chart stoppen Allgemeine Java-Themen 4
P Thread starten / stoppen / neustarten Allgemeine Java-Themen 8
E Durch System.in.read() blockierten Thread stoppen Allgemeine Java-Themen 10
L Thread stoppen über Button funktioniert nicht Allgemeine Java-Themen 7
B Scheduler soll bestimmten Job stoppen Allgemeine Java-Themen 4
M Thread aus anderer VM starten bzw. stoppen Allgemeine Java-Themen 7
G Thread stoppen Allgemeine Java-Themen 9
J Externes Programm starten und stoppen (Linux) Allgemeine Java-Themen 3
J zeit stoppen Allgemeine Java-Themen 11
C Thread stoppen und erneut starten Allgemeine Java-Themen 6
A TimerTask - Task stoppen - timer.cancel() funktioniert nicht Allgemeine Java-Themen 8
N Thread starten und Stoppen Allgemeine Java-Themen 14
J Thread stoppen Allgemeine Java-Themen 8
S methode stoppen / auf ein event warten Allgemeine Java-Themen 5
S blockierenden Prozess stoppen Allgemeine Java-Themen 13
F Dienst via Java Starten/Stoppen Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben