【问题标题】:ThreadPoolExecutor - differences between submit and execute methods? [duplicate]ThreadPoolExecutor - 提交和执行方法之间的区别? [复制]
【发布时间】:2013-06-20 04:24:36
【问题描述】:

我遇到了关于ThreadPoolExecutor 的问题。

写了一些代码后发现submit()方法会吃掉程序抛出的RuntimeException,但是execute()方法会重新抛出RuntimeException`。我想知道这是什么原因。

最近看了ThreadPoolExecutor的源码,知道了线程池的原理。 现在我明白了execute() 方法是如何执行的,但是我不明白submit() 方法是如何执行的。我只知道submit()方法会将RunnableCallable包裹在FutureTask中并调用execute()方法:

public Future submit(Runnable runnable)
{
    if(runnable == null)
    {
        throw new NullPointerException();
    } else
    {
        RunnableFuture runnablefuture = newTaskFor(runnable, null);
        execute(runnablefuture);
        return runnablefuture;
    }
}

那么,我的问题是:ThreadPoolExecutor 是如何执行FutureTask 的,为什么RuntimeException 被吃掉了?

【问题讨论】:

  • 这里有一个很好的解释stackoverflow.com/questions/3929342/…
  • 我知道submit()方法会将异常绑定到Future,但是看了ThreadPoolExecutor的源码,没找到它做的地方?所以我想知道 submit() 方法是如何将异常绑定到 Future 的?
  • 回答了解释

标签: java threadpool


【解决方案1】:

如果您查看newTaskFor 方法,您会发现RunnableFuture 实际上是java.util.concurrent.FutureTask 的实例。您应该会在此 FutureTask 类中看到 run 方法。

public void run() {
    sync.innerRun();
}

这里是 innerRun 方法:

    void innerRun() {
        if (!compareAndSetState(READY, RUNNING))
            return;

        runner = Thread.currentThread();
        if (getState() == RUNNING) { // recheck after setting thread
            V result;
            try {
                result = callable.call();
            } catch (Throwable ex) {
                setException(ex);
                return;
            }
            set(result);
        } else {
            releaseShared(0); // cancel
        }
    }

异常被捕获并设置为任务。当你调用 FutureTask 的 get 方法时,它会被包裹到 ExecutionException 中

 public V get() throws InterruptedException, ExecutionException {
    return sync.innerGet();
}

【讨论】:

  • 谢谢。我找到了答案,在ThreadPoolExecutor的runTask(Runnable runnable)方法中,会调用runnable.run(),所以会调用runnale或者fufureTask的run方法。
  • 我给你解释了提交和执行的区别。我以为这就是您要求的以及如何吃掉异常
猜你喜欢
  • 2011-04-30
  • 2014-11-01
  • 2013-07-01
  • 1970-01-01
  • 2010-10-30
  • 2013-02-26
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多