У меня есть довольно простой вопрос о ThreadPoolExecutor. У меня есть следующая ситуация: я должен уничтожать объекты из очереди, создавать для них подходящие рабочие задачи и отправлять их в ThreadPoolExecutor. Это довольно просто. Но в сценарии завершения работы многие рабочие могут быть поставлены в очередь на выполнение. Поскольку одна из этих задач может выполняться в течение часа, и я хочу, чтобы релятививно быстрая изящная остановка приложения, я хочу отбросить все задачи в очереди из ThreadPoolExecutor, в то время как уже обрабатываемые задачи должны быть выполнены нормально.
Документация ThreadPoolExecutor имеет метод remove(), но только позволяет удалить определенные задачи. purge() работает только для отмененных будущих задач. Моя идея состояла в том, чтобы очистить очередь, содержащую все задачи в очереди. ThreadPoolExecutor предоставляет доступ к этой внутренней очереди, но в документации указано:
Метод getQueue() позволяет получить доступ к рабочая очередь для целей мониторинга и отладки. Использование этого метода для любой другой цели не рекомендуется.
Таким образом, захват этой очереди и очистка это не вариант. Кроме того, в этом фрагменте документации говорится:
Два поставляемых метода, удалить (java.lang.Runnable) и очистить() доступны для помощи в хранении рекультивации, когда большое количество задачи в очереди будут отменены.
Как? Конечно, я могу сохранить список всех задач, которые я представил исполнителю, и в случае завершения работы итерации по всем записям и удалить их из ThreadPoolExecutor методом remove()... но... давайте, это потери памяти и хлопоты для поддержания этого списка. (Например, удаление уже выполненных задач)
Я ценю любые подсказки или решения!