我正在阅读一些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);
}
}
任何人都可以解释一下代码如何通过第一个if。我的意思是r
如何成为Future<?>
的实例?
答案 0 :(得分:2)
任何人都可以解释一下代码如何通过第一个if。我的意思是r如何成为Futureof的实例?
你很困惑。传递给Runnable
然后尝试将其投射到Future
并且不会延伸Runnable
的代码有些奇怪。它不是你经常看到的模式。这是ThreadPoolExecutor.afterExecute(...)
javadocs的javadocs,在查看代码之后,方法的r
参数已经完成了。
如果代码是FutureTask
而不是Future
,我认为代码会更干净。 FutureTask
甚至在javadocs中的示例代码正上方提到:
当任务中包含操作时(例如{@link FutureTask})...
FutureTask
实现了RunnableFuture
Runnable
和Future
,因此代码可以正常工作,但使用FutureTask
会减少混淆。
答案 1 :(得分:0)
'?'是类型参数,而不是类型参数!