【问题标题】:java.util.concurrent.RejectedExecutionException:java.util.concurrent.RejectedExecutionException:
【发布时间】:2015-03-10 14:19:54
【问题描述】:

我试图做小 poc 来了解 Futures.addCallback(future, callback) 和 Futures.addCallback(future, callback, executor1) 之间的区别。根据我的理解,在后一种情况下,回调应该由函数调用中指定的 executor1 运行。 但是,在运行以下代码 sn-p 时,我无法找出上述异常的原因:

  class MyTest implements Callable<Integer>{

    int i;
    int j;

    public MyTest(int k, int l) {
        i = k;
        j = l;
    }

    public int getI() {
        return i;
    }

    public void setI(int i) {
        this.i = i;
    }

    public int getJ() {
        return j;
    }

    public void setJ(int j) {
        this.j = j;
    }

    @Override
    public Integer call() throws Exception {
         System.out.println(Thread.currentThread().getName());  
        System.out.println("Computing.........");
        Thread.currentThread().sleep(5000);
        return i + j;
    }

}


Callable<Integer> call = new MyTest(1,2);
        ListeningExecutorService executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(1));
        ListeningExecutorService executor1 = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(1));
        //ExecutorService executor = Executors.newFixedThreadPool(1);
        ListenableFuture<Integer> future = executor.submit(call);
        FutureCallback<Integer> callback = new FutureCallback<Integer>() {

            @Override
            public void onSuccess(Integer result) {
                System.out.println(Thread.currentThread().getName());   
                System.out.println("Completed Successfully and result is :" + result);

            }

            @Override
            public void onFailure(Throwable t) {
                System.out.println("Failed");

            }
        };

        Futures.addCallback(future, callback, executor1);
        executor.shutdown();
        executor1.shutdown();

异常日志

 ????? ??, ???? ?:??:?? ??????? com.google.common.util.concurrent.ExecutionList executeListener
    SEVERE: RuntimeException while executing runnable com.google.common.util.concurrent.Futures$5@37e5f7d7 with executor com.google.common.util.concurrent.MoreExecutors$ListeningDecorator@3d1d9ca7
    java.util.concurrent.RejectedExecutionException: Task com.google.common.util.concurrent.Futures$5@37e5f7d7 rejected from java.util.concurrent.ThreadPoolExecutor@39220f5b[Terminated, pool size = 0, active threads = 0, queued tasks = 0, completed tasks = 0]
        at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2047)
        at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:823)
        at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1369)
        at com.google.common.util.concurrent.MoreExecutors$ListeningDecorator.execute(MoreExecutors.java:484)
        at com.google.common.util.concurrent.ExecutionList.executeListener(ExecutionList.java:156)
        at com.google.common.util.concurrent.ExecutionList.execute(ExecutionList.java:145)
        at com.google.common.util.concurrent.ListenableFutureTask.done(ListenableFutureTask.java:91)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:384)
        at java.util.concurrent.FutureTask.set(FutureTask.java:233)
        at java.util.concurrent.FutureTask.run(FutureTask.java:274)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at java.lang.Thread.run(Thread.java:745)

【问题讨论】:

  • 异常文本?
  • 我也不例外。当然,因为他遗漏了“MyTest”是什么,我只是用我自己的 Callable 伪造了它
  • 已更新问题,需要注意的一件事是取消注释 Thread.currentThread().sleep(5000); from call 方法没有出现异常。
  • @Jens 我认为问题出现在不同的上下文中,并且它与方法 Futures.addCallback(future, callback, executor1) 的错误使用有关。

标签: java guava


【解决方案1】:

抛出异常是因为在你的代码中 sn-p executor1 被调用 executor1.shutdown(); 停止尝试注释掉这一行并且异常消失了。

如果你想在callback 完成后关闭执行器,在回调代码中执行关闭

  FutureCallback<Integer> callback = new FutureCallback<Integer>() {

        @Override
        public void onSuccess(Integer result) {
            System.out.println(Thread.currentThread().getName());   
            System.out.println("Completed Successfully and result is :" + result);
            executor1.shutdown(); // shutdown it here! 
        }

        @Override
        public void onFailure(Throwable t) {
            System.out.println("Failed");
            executor1.shutdown(); // shutdown it here! 
        }
    };
    Futures.addCallback(future, callback, executor1);
    executor.shutdown();
    // executor1.shutdown(); // do not stop it here!

【讨论】:

  • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
  • 答案很简单——不要调用shutdown executor1来防止异常。
猜你喜欢
  • 2010-12-28
  • 2023-03-18
  • 2017-12-17
  • 1970-01-01
  • 2013-05-17
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多