我有一个 Controller ,我在其中使用 future 接口(interface)并在线程池中创建 5 个线程。该 Controller 由 ajax 调用调用。当我第一次调用这个 Controller 时,它运行良好,但如果我再次发出请求,它会显示下面的异常。
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,但我怀疑相关的类没有太大变化。在两种情况下,ThreadPoolExecutor
会从其 execute
方法抛出该异常,这两种情况都依赖于执行程序的状态为 SHUTDOWN
。
因此,我相当有信心执行器会拒绝您的任务提交,因为它在某个时刻被关闭。我注意到您的代码并没有讲述整个故事,因为它看起来执行器是一个可能被其他方法引用的类字段。检查您是否在其他地方调用 shutdown。 (请注意,执行器将被其终结器关闭;尽管在您发布的代码块中,它不可能有资格进行垃圾收集,因为它是最终字段。)
<小时/>作为脚注,每当您遇到代码问题时,提供 SSCCE 会很有用。 。您发布的代码无法编译,但修复此问题后,it runs successfully 。您可以派生我的 Ideone 脚本并重现您的问题吗?
关于java - 如何在使用 Future 接口(interface)时删除 java.util.concurrent.RejectedExecutionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37002452/