(Това е опит да възпроизведа по-ранния, изтрит отговор на Thilo с мои собствени корекции.)
Мисля, че може да се наложи да изясните въпроса си, тъй като има имплицитно безкрайно условие... в един момент трябва да решите да изключите своя изпълнител и в този момент той няма да приема повече задачи. Вашият въпрос изглежда предполага, че искате да изчакате, докато разберете, че няма да бъдат изпращани други задачи, което можете да знаете само в собствения си код на приложение.
Следният отговор ще ви позволи плавно да преминете към нов TPE (по каквато и да е причина), като завършите всички подадени в момента задачи и не отхвърляте нови задачи към новия TPE. Може да отговори на въпроса ви. @Thilo може също.
Ако приемем, че сте дефинирали някъде видим 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