如何在使用 Future Interface 时删除 java.util.concurrent.RejectedExecutionException
How to remove java.util.concurrent.RejectedExecutionException while using 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 但是当我再次发出请求时它打印提交任务但不打印任务已提交。谁能帮我看看我哪里做错了。
您没有具体提到您使用的 Java 是哪个版本,但我怀疑相关的 class 没有太大变化。 ThreadPoolExecutor
会在两种情况下从它的 execute
方法中抛出异常,这两种情况都依赖于执行者的状态 SHUTDOWN
.
所以我相当有信心执行者拒绝你的任务提交,因为它在某个时候被关闭了。我注意到您的代码并没有说明全部情况,因为看起来执行程序是一个 class 字段,可能会被其他方法引用。检查您是否在其他任何地方调用 shutdown 。 (请注意,执行程序将被其终结器关闭;尽管在您发布的代码块中,由于它是最终字段,因此无法进行垃圾回收。)
作为脚注,每当您遇到代码问题时,提供 SSCCE. The code you've posted doesn't compile, but after fixing this, it runs successfully 很有用。你能分叉我的 Ideone 脚本并重现你的问题吗?
我有一个控制器,我在其中使用未来接口并在线程池中创建 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 但是当我再次发出请求时它打印提交任务但不打印任务已提交。谁能帮我看看我哪里做错了。
您没有具体提到您使用的 Java 是哪个版本,但我怀疑相关的 class 没有太大变化。 ThreadPoolExecutor
会在两种情况下从它的 execute
方法中抛出异常,这两种情况都依赖于执行者的状态 SHUTDOWN
.
所以我相当有信心执行者拒绝你的任务提交,因为它在某个时候被关闭了。我注意到您的代码并没有说明全部情况,因为看起来执行程序是一个 class 字段,可能会被其他方法引用。检查您是否在其他任何地方调用 shutdown 。 (请注意,执行程序将被其终结器关闭;尽管在您发布的代码块中,由于它是最终字段,因此无法进行垃圾回收。)
作为脚注,每当您遇到代码问题时,提供 SSCCE. The code you've posted doesn't compile, but after fixing this, it runs successfully 很有用。你能分叉我的 Ideone 脚本并重现你的问题吗?