java - 如何在使用 Future 接口(interface)时删除 java.util.concurrent.RejectedExecutionException

标签 java multithreading futuretask

我有一个 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/

相关文章:

c++ - 在单独的线程中启动带参数的成员函数

java - 提交给执行者的 FutureTask 不运行

java - 用java粗略指南填写excel或pdf

java-如何检查发送的响应类型(响应为 JSON 格式)

java - 为什么 ThreadGroup 会受到批评?

java - 多线程 - 命名线程和处理异常

java - 使用parseDouble时出现空指针异常

java - 跳过 CXF 拦截器以获取 Web 服务中的方法之一

Python 线程堆栈大小和段错误