2010-10-31 5 views
2

J'utilise ThreadPoolExecutor pour exécuter certaines actions, à un moment donné, j'ai annulé certaines tâches futures et les ai stockées dans une liste pour arranger d'autres tâches, et ensuite je veux réactiver les futures tâches annulées. Le problème est quand je soumets la tâche dans le pool, il ne serait pas exécuté, ressemble à l'indicateur annulé ou fait est sauvé et reconnu par l'exécuteur de thread, et donc ce thread ne serait pas appelé.Comment réactiver un futurite annulé dans le pool de threads?

Que dois-je faire?

Répondre

1

Utilisez Runnable au lieu des unités d'exécution. Le pool d'exécution peut gérer un Runnable de la même manière qu'un Thread, mais un Runnable peut être réexécuté plusieurs fois.

+0

-1: Pas une réponse. L'OP n'utilise pas Threads directement, il utilise FutureTasks dans un ThreadPoolExecutor. Tous les pools d'exécution de la bibliothèque Java sont ThreadPoolExecutors, ce que l'OP utilise déjà. –

3

L'implémentation FutureTask maintient l'état annulé. Essentiellement, lorsque la méthode run() est appelée à nouveau, elle exécute une opération CAS qui échoue car l'état n'est pas exécutable et renvoie immédiatement sans invoquer la méthode call() Callable interne. Je ne pouvais pas trouver un moyen de récupérer le Callable d'origine ou de restaurer la FutureTask dans un état non annulé.

En réponse à ce que vous devez faire ... Devez-vous les annuler? Pourquoi ne pas les laisser courir? Si vous voulez une exécution prioritaire, pourriez-vous essayer de créer votre ThreadPoolexecutor avec un PriorityBlockingQueue et utiliser un Comparator pour établir la priorité. Cela permettra aux tâches d'être exécutées dans le bon ordre puisqu'elles seront ajoutées au PriorityBlockingQueue en fonction des résultats du Comparator.

+0

Merci, en fait, je viens d'implémenter une classe FutureTask personnalisée qui contient une référence à la Runnable d'origine, puis je peux la soumettre à nouveau. – virsir

+0

@virsir, d'accord, faites attention cependant. La façon dont FutureTask fonctionne dans l'exécuteur est que, malgré l'annulation, FutureTask sera sélectionné pour l'exécution. Le drapeau d'annulation convertit simplement la méthode d'exécution en no-op. Vous devez être sûr de ne pas essayer de réutiliser la même instance FutureTask. –

Questions connexes