0

我遇到了一个关于ThreadPoolExecutor.

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

最近看了一个线程池的源码ThreadPoolExecutor,知道了线程池的原理。现在我明白了execute()方法是如何执行的,但我不明白submit()方法是如何执行的。我只知道该submit()方法会将Runnableor包装Callable在 a 中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吃掉?

4

1 回答 1

0

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

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();
}
于 2013-06-24T07:49:10.530 回答