Ich habe diese ziemlich einfache Frage über die ThreadPoolExecutor. Ich habe die folgende Situation: Ich muss Objekte aus einer Warteschlange konsumieren, die entsprechenden Worker-Aufgaben für sie erstellen und sie an den ThreadPoolExecutor übergeben. Das ist ziemlich einfach. Aber innerhalb eines Shutdown-Szenarios viele Arbeiter können zur Ausführung in die Warteschlange gestellt werden. Da eine dieser Aufgaben möglicherweise eine Stunde lang ausgeführt wird und ich ein relativ schnelles ordnungsgemäßes Herunterfahren der Anwendung möchte, möchte ich alle in der Warteschlange befindlichen Aufgaben vom ThreadPoolExecutor verwerfen, während die bereits verarbeitenden Aufgaben normal beendet werden sollten.Alle Aufgaben in der Warteschlange eines ThreadPoolExecutor entfernen
Die ThreadPoolExecutor-Dokumentation verfügt über eine remove()-Methode, die es jedoch nur ermöglicht, bestimmte Aufgaben zu entfernen. purge() funktioniert nur für bereits abgebrochene Future-Aufgaben. Meine Idee war, die Warteschlange mit allen Aufgaben in der Warteschlange zu löschen. Der ThreadPoolExecutor ermöglicht den Zugriff auf diese interne Warteschlange aber die Dokumentation wird:
Method getQueue() ermöglicht den Zugang zur Arbeitswarteschlange für die Zwecke der und Debugging-Überwachung. Die Verwendung dieser Methode für jeden anderen Zweck ist stark abgeraten.
So greifen diese Warteschlange und Clearing ist keine Option. Auch dieser Ausschnitt der Dokumentation sagt:
zwei mitgelieferten Methoden, remove (java.lang.Runnable) und Löschen() sind in Speicher Gewinnung zu unterstützen, wenn eine große Anzahl von Tasks in der Liste werden gelöscht .
Wie? Sicher, ich kann eine Liste aller Aufgaben verwalten, die ich an den Executor übergeben habe, und in einem Shutdown-Fall iteriere ich über alle Einträge und entferne sie aus dem ThreadPoolExecutor mit der remove() -Methode ... aber ... komm, das ist a Verschwendung von Speicher und ein Ärger, um diese Liste zu pflegen. (Entfernen von bereits ausgeführten Aufgaben zum Beispiel)
Ich freue mich über Hinweise oder Lösungen!
Dies könnte der sauberste Ansatz sein, daher akzeptiere ich diese Antwort. :-) Auch ich habe gehofft, dass da schon sowas ist ... also: lasst uns dieses Ding coden. :-) – Malax