我正在阅读一些Javadoc,并且遇到了this example from ThreadPoolExecutor.afterExecute(...)
javadocs:
class ExtendedExecutor extends ThreadPoolExecutor {
// ...
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if (t == null && r instanceof Future<?>) {
try {
Object result = ((Future<?>) r).get();
} catch (CancellationException ce) {
t = ce;
} catch (ExecutionException ee) {
t = ee.getCause();
} catch (InterruptedException ie) {
Thread.currentThread().interrupt(); // ignore/reset
}
}
if (t != null)
System.out.println(t);
}
}
谁能解释一下代码如何通过第一个。我的意思是
r
如何成为instanceof Future<?>
? 最佳答案
谁能解释一下代码如何通过第一个。我的意思是r如何成为Future的实例?
你是正确的困惑。传入Runnable
并尝试将其强制转换为不扩展Future
的Runnable
有点奇怪。这不是您经常看到的模式。这在ThreadPoolExecutor.afterExecute(...)
javadocs的javadocs中,在查看代码后,该方法的r
参数是已完成的任务。
我认为,如果代码是FutureTask
而不是Future
,则代码将更加整洁。甚至在javadocs中的示例代码上方也提到了FutureTask
:
当任务中包含操作时(例如{@link FutureTask})...FutureTask
实现了既是RunnableFuture
又是Runnable
的Future
,因此代码可以正常工作,但是使用FutureTask
会减少混乱。
关于java - Future <?>的可运行实例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42707267/