(Это попытка воспроизвести ранее удаленный ответ Тило с моими собственными корректировками.)
Я думаю, вам может потребоваться прояснить свой вопрос, поскольку существует неявное бесконечное условие ... в какой-то момент вы должны решить закрыть своего исполнителя, и в этот момент он больше не будет принимать никаких задач. Похоже, ваш вопрос подразумевает, что вы хотите подождать, пока вы узнаете, что никакие дальнейшие задачи не будут отправлены, о чем вы можете узнать только в своем собственном коде приложения.
Следующий ответ позволит вам плавно перейти на новый 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.
person
andersoj
schedule
14.10.2010
shutdown()
- это то, как вы создаете край, после которого новые задачи не могут быть отправлены; вызовawaitTermination()
создает преимущество, гарантирующее, что вы заблокируете, пока не будут выполнены все ранее представленные задачи. - person andersoj   schedule 14.10.2010