如何在使用Future Interface

时间:2016-05-03 11:08:14

标签: java multithreading futuretask

我有一个控制器,我在其中使用未来的接口并在线程池中创建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,但是当我再次发出请求时,它会打印提交任务但不打印任务已提交。有人可以帮我解决我的错误。

1 个答案:

答案 0 :(得分:3)

您没有具体提到您正在使用的Java版本,但我怀疑相关的类没有太大变化。在两种情况下,ThreadPoolExecutor将从它的execute方法中抛出该异常,这两种情况都依赖于执行程序的状态为SHUTDOWN

所以我相信执行者拒绝你的任务提交,因为它在某个时候被关闭了。我注意到你的代码并没有讲述整个故事,因为看起来执行者是一个可能被其他方法引用的类字段。检查你是否在其他任何地方调用shutdown。 (请注意,执行程序将被其终结器关闭;尽管在您发布的代码块中,它不可能有资格进行垃圾收集,因为它是最终字段。)

作为脚注,无论何时遇到代码问题,提供SSCCE都很有用。您发布的代码无法编译,但在修复后,it runs successfully。您是否能够分享我的Ideone脚本并重现您的问题?