2016-05-03 1 views
0

J'ai un contrôleur dans lequel j'utilise l'interface future et la création de 5 threads dans le pool de threads. Ce contrôleur est appelé par un appel ajax. Quand j'appelle ce contrôleur la première fois qu'il fonctionne bien mais si je fais à nouveau la demande il montre l'exception ci-dessous.Comment supprimer java.util.concurrent.RejectedExecutionException lors de l'utilisation Future Interface

java.util.concurrent.RejectedExecutionException: Task [email protected] rejected from [email protected][Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 5] 

Je poste du code comment j'appelle les tâches.

private static final ExecutorService threadpool = Executors.newFixedThreadPool(20); 
    FactorialCalculator task1 = new FactorialCalculator("A"); 
    FactorialCalculator task2 = new FactorialCalculator("B"); 
    FactorialCalculator task3= new FactorialCalculator("C"); 
    FactorialCalculator task4 = new FactorialCalculator("D"); 
    FactorialCalculator task5= new FactorialCalculator("E"); 
    System.out.println("Submitting Task ..."); 
    Future future1 = threadpool.submit(task1); 
    Future future2 = threadpool.submit(task2); 
    Future future3 = threadpool.submit(task3); 
    Future future4 = threadpool.submit(task4); 
    Future future5 = threadpool.submit(task5); 
    System.out.println("Task is submitted"); 

Dans la première demande, il est en cours d'exécution tous Tasks- A, B, C, D et E, mais quand je fais la demande à nouveau il imprime la soumission des tâches, mais n'imprime pas la tâche est soumis. Quelqu'un peut-il aider à ce que je fais mal.

+3

Est-ce qu'il se produit une fermeture de l'exécuteur? – Fildor

Répondre

3

Vous n'avez pas mentionné spécifiquement quelle version de Java vous utilisez, mais je suppose que les classes concernées n'ont pas beaucoup changé. Le ThreadPoolExecutor va jeter cette exception de sa méthode execute dans deux cas, les deux reposant sur l'état de l'exécuteur étant SHUTDOWN. Donc, je suis assez confiant que l'exécuteur rejette vos soumissions de tâches parce qu'il est arrêté à un moment donné. Je remarque que votre code ne dit pas toute l'histoire, car il semble que l'exécuteur soit un champ de classe qui pourrait être référencé par d'autres méthodes. Vérifiez si vous appelez l'arrêt ailleurs. (Notez que l'exécuteur sera fermé par son finaliseur, bien que dans le bloc de code que vous avez posté il n'y a aucun moyen, il sera admissible à la collecte des ordures comme il est un champ final.)


Comme une note , chaque fois que vous rencontrez des problèmes avec le code, il est utile de fournir un SSCCE. Le code que vous avez publié ne compile pas, mais après avoir corrigé cela, it runs successfully. Êtes-vous capable de bifurquer mon script Ideone et de reproduire votre problème?

+0

Je ne fermais pas le pool de threads. Merci – Jaydeep

+0

Notez que lorsque vous faites défiler le message de l'exception de la question horizontalement, vous pouvez voir à partir de la sortie 'toString()' de l'exécuteur que son état est en effet 'Terminated' ... – Holger