Java Callable Future Example
Java executorフレームワークの利点の一つは、タスクを処理した後に単一の結果を返す可能性のある同時タスクを実行できることです。 Java並行性APIは、次の二つのインターフェイスCallable
とFuture
でこれを実現します。
Java CallableおよびFuture interfaces
1.1. Callable
Callable
インターフェイスにはcall()
メソッドがあります。 この方法では、タスクのロジックを実装する必要があります。 つまり、call()
メソッドが返すデータの型を指定する必要があります。
2.2. Future
Future
インタフェースには、Callable
オブジェクトによって生成された結果を取得し、その状態を管理するメソッドがあります。
Java Callable Future Example
この例では、Callable
型のFactorialCalculator
を作成しています。 これは、call()
メソッドをオーバーライドし、計算後にcall()
メソッドから結果を返すことを意味します。 この結果は、後でメインプログラムが保持しているFuture
参照から取得できます。
さて、2つのスレッドと4つの数字を使って上記の階乗計算機をテストしましょう。
プログラム出力。
ここでは、submit()
メソッドを使用してexecutorで実行されるCallable
オブジェクトを送信しました。 このメソッドは、パラメータとしてCallable
オブジェクトを受け取り、2つの主な目的で使用できるFuture
オブジェクトを返します–
- タスクの状態を制御することができます–タスクをキャンセルして完了したかどうかを確認することができます。 この目的のために、
isDone()
メソッドを使用して、タスクが完了したかどうかを確認しました。 - call()メソッドによって返された結果を取得できます。 この目的のために、
get()
メソッドを使用しました。 このメソッドは、Callable
オブジェクトがcall()
メソッドの実行を終了し、その結果を返すまで待機します。get()
メソッドが結果を待っている間にスレッドが中断された場合、InterruptedException
例外がスローされます。 4223>メソッドが例外をスローした場合、このメソッドはExecutionException
例外をスローします。
Future
インターフェイスは、get()
メソッドの別のバージョン、つまりget(longtimeout,TimeUnitunit)を提供します。 このバージョンのgetメソッドは、タスクの結果が利用できない場合、指定された時間待機します。 指定された期間が経過し、結果がまだ利用できない場合、メソッドはnull
値を返します。
幸せな学習!!