Mam to dość proste pytanie o ThreadPoolExecutor. Mam następującą sytuację: muszę spożywać obiekty z kolejki, tworzyć odpowiednie zadania dla nich i przesyłać je do ThreadPoolExecutor. To całkiem proste. Ale w scenariuszu wyłączania wielu pracowników może zostać umieszczonych w kolejce do wykonania. Ponieważ jedno z tych zadań może być uruchomione przez godzinę, a ja chcę relatywnie szybkiego, pełnego wdzięku zamknięcia aplikacji, chcę odrzucić wszystkie zadania w kolejce od ThreadPoolExecutor, podczas gdy zadania przetwarzania powinny być zakończone normalnie.Usuwanie wszystkich zadań kolejkowania ThreadPoolExecutor
Dokumentacja ThreadPoolExecutor ma metodę remove(), ale pozwala tylko na usunięcie określonych zadań. purge() działa tylko w przypadku już anulowanych zadań na przyszłość. Moim pomysłem było oczyszczenie kolejki z wszystkimi kolejnymi zadaniami. ThreadPoolExecutor zapewnia dostęp do tej kolejki wewnętrznej ale dokumentacja stwierdza:
Method getQueue() pozwala na dostęp do kolejki pracować dla celów monitorowania i debugowanie. Zastosowanie tej metody zniechęca do jakichkolwiek innych celów.
Więc chwytanie tej kolejki i czyszczenie jej nie jest opcją. Również ten fragment dokumentacji mówi:
metodDwa dostarczone, remove (java.lang.Runnable) i czyszczenie() są dostępne, aby pomóc w przechowywaniu rekultywacji gdy duża liczba kolejce zadań stać odwołany .
Jak? Oczywiście, mogę zachować listę wszystkich zadań, które przesłałem do executora, i w przypadku zamknięcia, iteruję po wszystkich wpisach i usuwam je z ThreadPoolExecutor za pomocą metody remove() ... ale ... chodź, to jest marnowanie pamięci i kłopot z utrzymaniem tej listy. (Usuwanie wcześniej wykonanych zadań)
Doceniam wszelkie wskazówki i rozwiązania!
To może być najczystsze podejście, dlatego akceptuję tę odpowiedź. :-) Nawet miałem nadzieję, że jest już coś takiego ... więc: pozwala nam to zakodować. :-) – Malax