我正在阅读一些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并尝试将其强制转换为不扩展FutureRunnable有点奇怪。这不是您经常看到的模式。这在ThreadPoolExecutor.afterExecute(...) javadocs的javadocs中,在查看代码后,该方法的r参数是已完成的任务。

我认为,如果代码是FutureTask而不是Future,则代码将更加整洁。甚至在javadocs中的示例代码上方也提到了FutureTask


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


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

关于java - Future <?>的可运行实例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42707267/

10-12 03:00