ThreadPoolExecutor - 提交和执行方法之间的区别?

时间:2013-06-23 15:32:26

标签: java threadpool

我遇到了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被吃掉?

1 个答案:

答案 0 :(得分:0)

如果您查看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();
}