Как удалить java.util.concurrent.RejectedExecutionException при использовании Future Interface

У меня есть контроллер, в котором я использую будущий интерфейс и создаю 5 потоков в пуле потоков. Этот контроллер вызывается вызовом ajax. Когда я вызываю этот контроллер в первый раз, он работает нормально, но если я делаю запрос снова, он показывает исключение ниже.

  java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@1cbbac9 rejected from java.util.concurrent.ThreadPoolExecutor@53ee53[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"); 

В первом запросе он выполняет все задачи - A,B,C,D и E, но когда я делаю запрос снова, он печатает отправляющие задачи, но не печатает. Задача отправлена. Может кто-нибудь выручить, что я делаю не так.

1 ответ

Решение

Вы не упомянули конкретно, какую версию Java вы используете, но я подозреваю, что соответствующие классы не сильно изменились. ThreadPoolExecutor выбросит это исключение из его execute метод в двух случаях, оба из которых зависят от состояния исполнителя SHUTDOWN,

Так что я совершенно уверен, что исполнитель отклоняет ваши задания, потому что в какой-то момент его закрывают. Я заметил, что ваш код не рассказывает всю историю, так как выглядит, как будто executor - это поле класса, на которое могут ссылаться другие методы. Проверьте, не звоните ли вы где-нибудь еще. (Обратите внимание, что исполнитель будет закрыт своим финализатором; хотя в опубликованном вами блоке кода нет никакой возможности для сбора мусора, так как это конечное поле.)


В качестве сноски, всякий раз, когда у вас возникают проблемы с кодом, полезно предоставить SSCCE. Размещенный вами код не компилируется, но после исправления он работает успешно. Вы можете раскошелиться на мой скрипт Ideone и воспроизвести вашу проблему?

Другие вопросы по тегам