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

如何在使用Future接口时删除java.util.concurrent.RejectedExecutionException,java,multithreading,futuretask,Java,Multithreading,Futuretask,我有一个控制器,我在其中使用future接口并在threadpool中创建5个线程。此控制器由ajax调用调用。当我第一次调用此控制器时,它运行正常,但如果我再次发出请求,它将显示以下异常 java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@1cbbac9 rejected from java.util.concurrent.ThreadPoolExecutor@53ee5

我有一个控制器,我在其中使用future接口并在threadpool中创建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,但我怀疑相关的类没有太大的变化。
ThreadPoolExecutor
将在两种情况下从其
execute
方法抛出该异常,这两种情况都依赖于执行器的状态为
SHUTDOWN

因此,我相当有信心,执行人会拒绝您提交的任务,因为它将在某个时候关闭。我注意到您的代码并没有说明全部情况,因为它看起来像是一个类字段,可能会被其他方法引用。检查您是否在其他地方呼叫关机。(请注意,executor将被其终结器关闭;尽管在您发布的代码块中,它不可能符合垃圾收集的条件,因为它是最终字段。)



作为一个脚注,每当您在代码方面遇到问题时,提供一个。您发布的代码未编译,但在修复此问题后。你能用我的Ideone脚本重现你的问题吗?

你没有特别提到你使用的是哪个版本的Java,但我怀疑相关的类没有太大变化。
ThreadPoolExecutor
将在两种情况下从其
execute
方法抛出该异常,这两种情况都依赖于执行器的状态为
SHUTDOWN

因此,我相当有信心,执行人会拒绝您提交的任务,因为它将在某个时候关闭。我注意到您的代码并没有说明全部情况,因为它看起来像是一个类字段,可能会被其他方法引用。检查您是否在其他地方呼叫关机。(请注意,executor将被其终结器关闭;尽管在您发布的代码块中,它不可能符合垃圾收集的条件,因为它是最终字段。)



作为一个脚注,每当您在代码方面遇到问题时,提供一个。您发布的代码未编译,但在修复此问题后。你能用我的Ideone脚本来重现你的问题吗?

真的关闭了executor?真的关闭了executor?请注意,当你水平滚动问题的异常消息时,你可以从executor的
toString()中看到
输出其状态确实是
终止的
…请注意,当您水平滚动问题的异常消息时,您可以从执行者的
toString()
输出中看到其状态确实是
终止的