2016-05-03 9 views
0

Ich habe einen Controller, in dem ich zukünftige Schnittstelle verwenden und 5 Threads in Threadpool erstellen. Dieser Controller wird durch einen Ajax-Aufruf aufgerufen. Wenn ich diesen Controller das erste Mal anrufe, läuft es gut, aber wenn ich die Anfrage erneut mache, wird die Ausnahme unten angezeigt.So entfernen Sie java.util.concurrent.RejectedExecutionException während der Verwendung von 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] 

Ich poste Code, wie ich die Aufgaben nenne.

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"); 

In erster Anforderung wird es läuft alle Aufgaben- A, B, C, D und E, aber wenn ich frag mich wieder druckt es Aufgaben einreichen, aber nicht gedruckt Aufgabe vorgelegt. Kann mir jemand helfen, was ich falsch mache?

+3

Zufälligerweise den Executor herunterfahren? – Fildor

Antwort

3

Sie haben nicht speziell erwähnt, welche Version von Java Sie verwenden, aber ich vermute, dass sich die relevanten Klassen nicht sehr geändert haben. Die ThreadPoolExecutor wird diese Ausnahme aus ihrer execute Methode in zwei Fällen werfen, die beide auf den Executor-Status SHUTDOWN beruhen.

Also bin ich ziemlich zuversichtlich, dass der Executor Ihre Aufgabe abschickt, weil es irgendwann heruntergefahren wird. Ich bemerke, dass Ihr Code nicht die ganze Geschichte erzählt, da es so aussieht, als sei der Executor ein Klassenfeld, auf das andere Methoden verweisen könnten. Überprüfen Sie, ob Sie Shutdown an einem anderen Ort aufrufen. (Beachten Sie, dass der Vollstrecker wird durch seine Finalizerthread heruntergefahren werden, wenn in dem Block von Code, den Sie geschrieben haben es keine Möglichkeit gibt, wird es für die Garbage Collection in Betracht, da es ein letztes Feld ist.)


Als Fußnote Wenn Sie Probleme mit dem Code haben, ist es nützlich, eine SSCCE anzugeben. Der Code, den Sie gepostet haben, wird nicht kompiliert, aber nachdem Sie das behoben haben, it runs successfully. Kannst du mein Ideone-Skript forkieren und dein Problem reproduzieren?

+0

Ich habe den Threadpool nicht heruntergefahren. Danke – Jaydeep

+0

Beachten Sie, dass, wenn Sie die Nachricht der Ausnahme der Frage horizontal scrollen, Sie von der 'tString()' Ausgabe des Ausführers sehen können, dass sein Zustand tatsächlich 'Beendet' ist ... – Holger