3

以下は、ジョブを送信するコードです。3つのスレッドを実行しているとしましょう。getメソッドはどのように待機して適切なスレッド結果を取得しますか。

Future<?> result = threadPool.submitTasks(new Callable<T>() {
            public T call() throws Exception {
                // do something
        }

});
anyType = (T) result.get(); 

または、タスクAの結果が1で、タスクBの結果が2であるとします。getメソッドに関して、正しい値を返すという保証は何ですか。

4

2 に答える 2

5

送信されたタスク(この場合はCallable)は、返されたのインスタンスにラップされますFuture。本質的に、Future、それが作成されたタスクに直接関連しており、他のタスクには関連していません。

内部的には、を呼び出すときgetに、futureはラップされたタスクと共通のロックを取得しようとします。取得すると、次に何をするかを決定するために、タスクのステータスを照会します。

  1. Futureがキャンセルされた場合、または基になるタスクが例外を生成した場合は、例外をスローします
  2. それ以外の場合は、タスクによって生成された結果を返します。

これは大まかにそれがどのように機能するかであり、いくつかの実装がFutureあり、それらはすべて異なる内部ロジックを持っています。

于 2013-03-06T17:11:54.690 に答える
0

あなたは彼らが正しい出力を受け取るという保証があると仮定しています。これは、スレッドセーフコードの実装に関する質問です。

多くの場合、実装スレッドを安全にするために、ある種のフラグを使用して使用をロックします。これは、他のスレッドにそれを使用できないことを示します。

于 2013-03-06T17:04:08.670 に答える