4

次のコードはAbstractExecutorServiceからのものです。

 /**
 * Returns a <tt>RunnableFuture</tt> for the given callable task.
 *
 * @param callable the callable task being wrapped
 * @return a <tt>RunnableFuture</tt> which when run will call the
 * underlying callable and which, as a <tt>Future</tt>, will yield
 * the callable's result as its result and provide for
 * cancellation of the underlying task.
 * @since 1.6
 */
 protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
    return new FutureTask<T>(callable);
 }

newTaskFor()から返されたオブジェクトのクラスがCallableFutureではなくRunnableFutureと呼ばれる理由がわかりません。ここで何が欠けていますか?

4

4 に答える 4

6

aのポイントRunnableFutureは次のとおりです。

  1. それはFuture
  2. それはRunnable

Callableそれはあなたがすでに持っているものをaFutureとaの両方である何かに変換しますRunnable。それがカバーすることを意図している正確なユースケースをカバーします。Callableがあり、が必要な場合はFutureFutureTaskコンストラクターがあります。

于 2012-07-11T08:45:41.517 に答える
5

RunnableFutureは特定の概念を表します: を呼び出すことによって、ワーカー スレッドが明示的に計算を実行できる将来の結果ですrun()

ワーカー スレッドは通常、実行する計算の結果には関心がrun()ないため、結果を返さないメソッドを使用します。get()そして、これらの結果に関心のあるスレッドは、ワーカー スレッドが計算を終了するとすぐに結果を取得できます。

于 2012-07-11T08:34:40.347 に答える
2

それはRunnable、つまり、public void run()メソッドを持つ ではなく、メソッドCallableを持っている<T> public <T> run()ためです。

于 2012-07-11T08:04:20.797 に答える
0

API アーキテクトがこの質問をされたことがないため、おそらく簡単でしょうか?

わからないので、問い合わせることしかできません: RunnableFuture を返す newTaskFor(Runnable...) メソッドがあります。

次に、newTaskFor(Callable...) メソッドが追加されました。Callable は、RunnableFuture を実装する FutureTask にラップすることもできるため、Callable をラップすることを明確にするために、新しいインターフェイスを発明する代わりにそれを行いました。 : オッカムのカミソリの原理に沿って、可能な限り最も単純な解決策、つまり既に存在する解決策を使用します。

于 2012-07-11T08:47:30.097 に答える