(Ceci est une tentative de reproduire Thilo plus tôt, supprimé réponse avec mes propres réglages.)
Je pense que vous pouvez avoir besoin de clarifier votre question car il y a un implicite infini condition... à un point que vous avez à décider d'arrêter votre exécuteur testamentaire, et à ce moment il n'accepte pas plus de tâches. Votre question semble impliquer que vous voulez attendre jusqu'à ce que vous savez qu'aucun d'autres tâches seront soumis, que vous ne connaissez dans votre propre code d'application.
La réponse suivante vous permettra de transition vers un nouveau TPE (pour quelque raison que ce soit), en remplissant tous les actuellement soumis tâches, et non pas de rejeter les nouvelles tâches de la nouvelle TPE. Il pourrait répondre à votre question. @Thilo peut aussi.
En supposant que vous avez défini dans un endroit visible TPE en usage en tant que tel:
AtomicReference<ThreadPoolExecutor> publiclyAvailableTPE = ...;
Vous pouvez alors écrire les TPE swap de routine en tant que tel. Il peut aussi être écrite à l'aide d'une méthode synchronisée, mais je pense que c'est plus simple:
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();
}
Alternativement, si vous avez vraiment pas une blague voulez tuer le fil de la piscine, alors votre demandeur côté, la nécessité de faire face à rejeté les tâches à un certain point, et vous pouvez utiliser null
pour la nouvelle 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();
}
Ce qui pourrait causer des problèmes en amont, l'appelant aurait besoin de savoir quoi faire avec un null
.
Vous pouvez également échanger avec un mannequin TPE que simplement rejetés chaque nouvelle exécution, mais c'est équivalent à ce qui se passe si vous appelez shutdown()
sur le TPE.