我遇到了ThreadPoolExecutor
的问题。
在编写了一些代码后,我发现submit()
方法会占用程序抛出的RuntimeException
,但execute()
方法将重新抛出RuntimeException。我想知道原因。
我最近阅读了ThreadPoolExecutor
的源代码,并了解了线程池的原理。
现在我理解execute()
方法如何执行,但我无法理解submit()
方法是如何执行的。我只知道submit()
方法会将Runnable
或Callable
包裹在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
被吃掉?
答案 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();
}