(Это попытка воспроизвести ранее удаленный ответ Тило с моими собственными изменениями.)
Я думаю, что вам, возможно, придется уточнить ваш вопрос, поскольку существует неявное бесконечное условие ... в какой-то момент вы должны решить закрыть своего исполнителя, и в этот момент он не примет больше никаких задач. Похоже, ваш вопрос подразумевает, что вы хотите подождать, пока вы не узнаете , что дальнейшие задачи не будут отправлены, что вы можете знать только в своем собственном коде приложения.
Следующий ответ позволит вам плавно перейти к новому TPE (по какой-либо причине), выполнить все представленные в настоящее время задачи и не отклонять новые задачи для нового TPE. Это может ответить на ваш вопрос. @ Тило тоже может.
Предполагая, что вы определили где-то видимый используемый TPE как таковой:
AtomicReference<ThreadPoolExecutor> publiclyAvailableTPE = ...;
Затем вы можете написать процедуру подкачки TPE как таковую. Это также может быть написано с использованием синхронизированного метода, но я думаю, что это проще:
void rotateTPE()
{
ThreadPoolExecutor newTPE = createNewTPE();
// atomic swap with publicly-visible TPE
ThreadPoolExecutor oldTPE = publiclyAvailableTPE.getAndSet(newTPE);
oldTPE.shutdown();
// and if you want this method to block awaiting completion of old tasks in
// the previously visible TPE
oldTPE.awaitTermination();
}
В качестве альтернативы, если вы действительно не шутите, хотите уничтожить пул потоков, то вашей стороне-отправителю в какой-то момент потребуется справиться с отклоненными задачами, и вы можете использовать null
для нового TPE:
void killTPE()
{
ThreadPoolExecutor oldTPE = publiclyAvailableTPE.getAndSet(null);
oldTPE.shutdown();
// and if you want this method to block awaiting completion of old tasks in
// the previously visible TPE
oldTPE.awaitTermination();
}
Что может вызвать проблемы в восходящем направлении, вызывающий должен знать, что делать с null
.
Вы также можете поменяться с фиктивным TPE, который просто отклоняет каждое новое выполнение, но это эквивалентно тому, что происходит, если вы вызываете shutdown()
на TPE.