2009-10-05 4 views
16

Le nombre de tâches (threads) soumises n'est également pas énorme dans ce scénario de test.Pourquoi Executors.newCachedThreadPool lance java.util.concurrent.RejectedExecutionException pendant l'envoi

+2

Pourriez-vous préciser votre question? Par exemple. ajoutez un court test. – Kutzi

+0

Désolé, il n'y a pas beaucoup de code que je peux partager pour des raisons de propriété intellectuelle. Dans la coquille de noix, j'appelle soumettre avec Callable types. Je suis à la recherche de scénarios potentiels, cela peut arriver. –

+1

Êtes-vous en train de dire qu'il n'y a pas de scénario particulier que vous étudiez, mais plutôt que vous aimeriez connaître les scénarios hypothétiques où cette exception pourrait être levée? Si oui, vous devriez reformuler la question de 'Pourquoi ...' à 'Quand ...' – akf

Répondre

30

Vous devrez fournir des exemples de code de la façon dont vous instancier et appeler submit sur la piscine (IP devrait être un non-question ici que nous ne avons pas besoin de détails sur le fonctionnement interne de vos Callable classes ou quoi que ce soit comme cette). D'après les informations que vous avez fournies, vous fermez le service d'exécution quelque part avant de soumettre l'appel. Vérifiez si vous faites des appels au shutdown ou au shutdownNow, et si c'est le cas, assurez-vous de ne pas ajouter de tâches après ce point. Au-delà de cela, vous pouvez enregistrer votre propre implémentation de java.util.concurrent.RejectedExecutionHandler afin de faciliter le débogage; son message rejectedExecution sera appelé chaque fois que l'exécuteur est incapable d'accepter une tâche, de sorte que vous pouvez y mettre une logique d'inspection d'état rudimentaire pour vous aider à trouver la cause.

+0

Vous aviez raison; J'ai trouvé le code qui fermait le pool d'exécuteurs; Merci –

25

Je ne vois nulle part dans l'appel des méthodes Executors.newCachedThreadPool() où un RejectedExecutionException est levé. Il n'y a que trois cas où il semble être jeté en Java 6:

  • lorsque vous appelez execute() sur un ThreadPoolExecutor et la taille de la piscine maximale a été atteinte.
  • lors de l'appel execute() sur un ThreadPoolExecutor en même temps que shutdownNow, et a essentiellement perdu la course avec l'appel shutdownNow.
  • lors de la tentative de planification de l'exécution d'une exécution dans un ScheduledThreadPoolExecutor après l'arrêt de l'exécuteur.
+4

+1 pour avoir listé tous les cas possibles –

Questions connexes