(Это попытка воспроизвести ранее, удаленный ответ Тило с собственными корректировками.)
Я думаю, что вам, возможно, потребуется уточнить ваш вопрос, поскольку существует неявное бесконечное состояние ... в какой-то момент у вас есть чтобы решить закрыть своего исполнителя, и в этот момент он больше не примет никаких задач. Ваш вопрос, кажется, подразумевает, что вы хотите подождать, пока не найдете , что дальнейшие задачи не будут отправлены, о которых вы можете узнать только в своем собственном коде приложения.
Следующий ответ позволит вам плавно перейти на новый 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.
Если вы в порядке с добавлением новых задач, что произойдет, если оно не закончится? – Kylar
Я думаю, что littleFluffyKitty только хочет дождаться завершения «старых» задач. – Thilo
Я не настолько обеспокоен возможностью, что он никогда не закончится, потому что, если это так, то что-то еще уже ужасно нарушено. Если все остальное не сработает, я смогу реализовать какое-то время, но я согласен с тем, что он закончит. Я хочу, чтобы он мог выполнять новые задачи, пока он ждет, или сказать это по-другому, я хочу, чтобы новые задачи могли быть добавлены после вызова wait. – cottonBallPaws