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値を返します。
幸せな学習!!