2017-03-09 67 views
0

我讀了一些javadoc和我遇到this example from ThreadPoolExecutor.afterExecute(...) javadocs:Runnable instanceof Future <?>?

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如何可以實例化爲Future<?>

+4

你能解釋一下爲什麼你認爲這不可能嗎? – ruakh

+2

嗯,也許'r'是[RunnableFuture](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/RunnableFuture.html)。 – azurefrog

+6

'公共類Foo實現Runnable,未來 {...}' –

回答

2

任何人都可以解釋我如何通過第一代碼。我的意思是如何r可以是未來的實例?

你是正確的混淆。有些奇怪的代碼在Runnable中傳遞,然後嘗試將其轉換爲Future,該代碼不延伸Runnable。這不是你經常看到的模式。這是在ThreadPoolExecutor.afterExecute(...) javadocs的javadoc中,在查看代碼之後,該方法的參數r是已完成的任務。

我認爲的代碼將是一個很多更乾淨,如果它是一個FutureTask,而不是FutureFutureTask甚至提到右上面的javadoc示例代碼:

當操作被封閉在任務(如{@link FutureTask})...

FutureTask實現RunnableFuture這既是一個RunnableFuture,所以代碼可以正常工作,但使用FutureTask會更少混淆。

+0

'FutureTask'是屬於'Runnable'和'Future'的實現之一。有可能是另一套的對象是Runnable'和'Future'的'兩部分,但依然能夠FutureTask'對象的'。我認爲javadoc更精確。如果你使用'FutureTask'你可能會錯過可能由第三方框架,甚至被你介紹了一些實現。 – ony

相關問題