2017-03-09 1 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はinstanceof Future<?>することができますか?

+4

なぜあなたはそれが*不可*と考えられるのか説明できますか? – ruakh

+2

さて、おそらく 'r'は[RunnableFuture](http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/RunnableFuture.html)です。 – azurefrog

+6

'FooはRunnable、Futureを実装します {...}' –

答えて

2

コードがどのように最初のものを渡すことができるか誰にも教えてください。私は、将来のinstanceofになることができますか?

あなたは間違いがありません。 Runnableに入ってからFutureにキャストしようとすると、それはRunnableに拡張されない、やや奇妙なコードです。あなたがよく見るパターンではありません。これはjavadocsのThreadPoolExecutor.afterExecute(...) javadocsであり、コードを見た後、メソッドの引数rは終了したタスクです。

Futureの代わりにFutureTaskだったらコードがもっときれいになると思います。

アクションが(例えば、{@link FutureTask}のように)タスクで囲まれ

...

FutureTaskRunnableFutureを実装両方aは:FutureTaskあっても右のJavadocのサンプル・コードの上に記載されていますRunnableFutureなので、コードは動作しますが、FutureTaskを使用すると混乱は少なくなります。

+0

'FutureTask'は' Runnable'と 'Future'の両方に属する実装の一つです。 'Runnable'と' Future'の両方に存在するが、まだ 'FutureTask'オブジェクトの外にある代替のオブジェクトセットがあるかもしれません。私はjavadocがより正確だと思います。 'FutureTask'を使うと、サードパーティーのフレームワークやあなたによって導入されるかもしれない実装がいくつか見落とされるかもしれません。 – ony

関連する問題