2017-11-22 25 views
1

このanswerからCallableRunnableの唯一の違いは、前者が実行結果を返して例外をスローできるということです。ExecutorインターフェイスにCallableをパラメータとして使用するメソッドがない理由を教えてください。

ExecutorCallable取るメソッド定義していない理由を私は理解していない:私の視点から

void execute(Callable command); 

を、RunnableCallableの両方のためのメソッドを作成することが論理的だろう。 ExecutorのサブインターフェイスであるExecutorServiceには、RunnableCallableの両方について同様のsubmit()の方法があります。

私はインターネット上で何かの説明を見つけることができないので、この設計の決定について説明してください。

+0

本当に知りたいのであれば、公開フォーラムでこれを聞いてはいけませんが、実際にそれを設計した人 – Stultuske

答えて

2

Executorは、Callableを受け取る方法を定義していない理由はわかりません。提出されたタスクを実行する-

Executorは、単一の責任を負っています。この抽象化レベルでは、Runnableのみを使用するAPIは、ExecutorServiceによって提案された追加機能を要求しません。

RunnableCallableの両方のメソッドを作成することは理にかなっています。

はい、ExecutorServiceインターフェイスは、Executorを拡張して設計されています。 ExecutorServiceは、タスク実行の結果を提供する重要な違いを提供します()。これは、Callable,TimeUnit、およびライフサイクルメソッドが追加された理由です。

2

私はExecutorデザインができるだけシンプルであることを意図していたとします。 execute()は結果を得るための手段を提供しないので、Callableを受け入れず、Runnablesだけを取ります。

一方、さまざまなsubmit()関数はFuturesを返します.Futuresは、(Callableからの)結果を取得するため、または実行が完了するのを待つために使用できます。したがって、RunnableとCallableの両方を受け入れることは理にかなっています。

2

実行者はタスクを実行します。タスクをいつ、どのように実行すべきかを管理したい場合に必要です。実行者はタスク結果を収集しないため、Runnableのみをサポートします。

Callableをサポートするものとします。それでは、結果をどのように取り出すべきですか?現在のスレッドの実行をブロックするので、T execute(Callable<T> command)はオプションではありません。したがって、T getResult()とペアにするか、Future<T>を返す必要があります。そのために<T> Future<T> submit(Callable<T> task)という方法でExecutorServiceがあります。

関連する問題