J'ai mis en œuvre une logique d'annulation personnalisée comme décrit dans Concurrency in Practice.Annulation personnalisée pour FutureTask
Encapsulating nonstandard cancellation in a task with newTaskFor.
Cela fonctionne très bien et je peux appeler annuler sur le futur et la tâche est annulée comme prévu. Je dois pouvoir détruire mon service d'exécuteur que j'utilise en appelant la méthode "shutdownNow", mais cette méthode appelle simplement l'interruption des threads, ce qui signifie que ma logique d'annulation personnalisée n'est jamais appelée. Comme mes tâches utilisent des sockets non bloquantes qui interrompent le thread, cela ne fonctionne pas, d'où ma logique d'annulation personnalisée.
Existe-t-il une solution simple pour annuler toutes les tâches en cours. J'ai essayé d'écraser la méthode shutdown sur ThreadPoolExecutor mais je n'ai pas accès à la liste des workers. Je voudrais pouvoir tout annuler en fermant l'exécuteur comme il est utilisé dans plusieurs endroits pour soumettre des tâches, y a-t-il une solution simple à cela?
try executor.shutdownNow() – Emil
oui essayé, et si vous regardez l'implémentation de shutdownNow il appelle simplement thread.interupt et ne délègue pas à la méthode d'annulation du futur. – crafty