如何在使用 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 脚本并重现你的问题吗?