2016-05-03 7 views
0

私は将来のインターフェイスを使用し、スレッドプールで5つのスレッドを作成しているコントローラを持っています。このコントローラーは、ajax呼び出しによって呼び出されます。私はこのコントローラを初めて呼び出すときにうまく動作しますが、私がリクエストをもう一度行うと、以下の例外が表示されます。将来のインターフェイスを使用中にjava.util.concurrent.RejectedExecutionExceptionを削除する方法

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

私はどのようにタスクを呼び出しているのですか?最初の要求で

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

それはすべてのtasks- A、B、C、DとEを実行しているが、私は再び要求を行う際には、タスクを送信する出力しますが、タスクが送信される印刷されません。誰かが私が間違っていることを助けることができますか?

+3

エグゼキュータをシャットダウンするとどうなりますか? – Fildor

答えて

3

あなたは使用しているJavaのバージョンについて特に言及していませんが、関連するクラスはあまり変更されていないと思われます。 ThreadPoolExecutorは、その例外を2つのケースでexecuteメソッドからスローします。どちらもexecutorの状態がSHUTDOWNであることに依存します。

私はexecutorがある時点でシャットダウンされているので、あなたの仕事の提出を拒否していると確信しています。私は、実行者が他のメソッドによって参照される可能性のあるクラスフィールドであるように、あなたのコードが全体の話をしていないことに気付きます。他の場所でシャットダウンを呼び出すかどうかを確認してください。 (executorがそのファイナライザによってシャットダウンされることに注意してください。コードのブロックにあなたが投稿したものの、それは最後のフィールドだとして、それがガベージコレクションの対象になります方法はありません)脚注として


コードに問題がある場合はいつでも、SSCCEを提供すると便利です。投稿したコードはコンパイルされませんが、修正後はit runs successfullyです。 Ideoneスクリプトをフォークして問題を再現できますか?

+0

私はスレッドプールをシャットダウンしていませんでした。ありがとう – Jaydeep

+0

例外のメッセージを水平方向にスクロールすると、エグゼキュータの 'toString()'出力からその状態が実際に 'Terminated'であることがわかります – Holger

関連する問題