【问题标题】:Runnable instanceof Future<?>?可运行的未来实例<?>?
【发布时间】:2017-03-09 23:09:23
【问题描述】:

我正在阅读一些 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&lt;?&gt; 的instanceof?

【问题讨论】:

  • 您能解释一下为什么您认为这不可能可能吗?
  • 好吧,也许rRunnableFuture
  • public class Foo implements Runnable, Future&lt;Bar&gt; { ... }
  • 非常感谢大家!

标签: java multithreading threadpool future runnable


【解决方案1】:

谁能解释一下代码如何通过第一个 if。我的意思是 r 如何成为未来的实例?

你的困惑是正确的。传入Runnable 然后尝试将其转换为不扩展RunnableFuture 有点奇怪。这不是您经常看到的模式。这是在 ThreadPoolExecutor.afterExecute(...) javadocs 的 javadocs 中,查看代码后,该方法的 r 参数是已完成的任务。

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

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

FutureTask 实现了 RunnableFuture,它既是 Runnable 又是 Future,因此代码可以工作,但使用 FutureTask 会更容易混淆。

【讨论】:

  • FutureTask 是属于RunnableFuture 的实现之一。可能有一组替代对象,它们都是 RunnableFuture 的一部分,但仍然不在 FutureTask 对象中。我认为 javadoc 更精确。如果您使用FutureTask,您可能会错过一些可能由 3rd 方框架甚至您自己引入的实现。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2020-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    相关资源
    最近更新 更多