Как удалить 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 и воспроизвести вашу проблему?