Runnable instanceof Future <! - ? - >?

时间:2017-03-09 23:09:23

标签: java multithreading threadpool future runnable

我正在阅读一些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<?>的实例?

2 个答案:

答案 0 :(得分:2)

  

任何人都可以解释一下代码如何通过第一个if。我的意思是r如何成为Futureof的实例?

你很困惑。传递给Runnable然后尝试将其投射到Future并且不会延伸Runnable的代码有些奇怪。它不是你经常看到的模式。这是ThreadPoolExecutor.afterExecute(...) javadocs的javadocs,在查看代码之后,方法的r参数已经完成了。

如果代码是FutureTask而不是Future,我认为代码会更干净。 FutureTask甚至在javadocs中的示例代码正上方提到:

  

当任务中包含操作时(例如{@link FutureTask})...

FutureTask实现了RunnableFuture RunnableFuture,因此代码可以正常工作,但使用FutureTask会减少混淆。

答案 1 :(得分:0)

'?'是类型参数,而不是类型参数!