Java では、マルチスレッドによりタスクを同時に実行できるため、パフォーマンスと応答性が向上します。従来、開発者は Runnable インターフェイスを使用してタスクを定義していましたが、これには 2 つの大きな制限がありました。それは、結果を返せないことと、チェックされた例外をスローできないことです。これらを克服するために、Java は Java 5 で Callable インターフェイスと Future インターフェイスを導入しました。
呼び出し可能なインターフェース
の 呼び出し可能なインターフェース は結果を返すタスクを表し、例外をスローする可能性があります。これは Runnable に似ていますが、値を返してチェック例外をスローできるため、より柔軟です。
Javaimport java.util.concurrent.*; public class CallableExample { public static void main(String[] args) throws Exception { ExecutorService executor = Executors.newSingleThreadExecutor(); Callable<Integer> task = () -> { int sum = 0; for (int i = 1; i <= 5; i++) sum += i; return sum; // returns result }; Future<Integer> future = executor.submit(task); System.out.println('Result: ' + future.get()); executor.shutdown(); } }
出力
Result: 15
説明: Callable タスクが実行者に送信されます。 1 から 5 までの数値の合計を計算し、結果を返します。結果は、タスクの終了後に future.get() を使用して取得されます。
将来のインターフェース
の 将来のインターフェース
Javaimport java.util.concurrent.*; public class CallableFutureExample { public static void main(String[] args) { ExecutorService executor = Executors.newSingleThreadExecutor(); Future<Integer> future = executor.submit(() -> 10 + 20); try { Integer result = future.get(); // waits but returns instantly System.out.println('Result: ' + result); } catch (Exception e) { e.printStackTrace(); } finally { executor.shutdown(); } } }
出力
Result: 30
説明: のCallableタスクが計算する10 + 2 and ExecutorService.submit()メソッドはFuture物体。使用するfuture.get()計算が完了すると結果が得られます。
呼び出し可能 vs 未来
| 特徴 | 呼び出し可能 | 未来 |
|---|---|---|
| 目的 | 結果を返すタスクを表します | 非同期タスクの結果を表します |
| 戻り値の型 | 実行時に結果を返す | Callable によって返された結果を保持します。 |
| で定義 | java.util.concurrent パッケージ | java.util.concurrent パッケージ |
| 実行 | ExecutorService に送信されました | ExecutorService.submit() によって返される |
| メソッド | call() メソッドが 1 つあります | get() isDone() cancel() のようなメソッドがあります |
| 例外処理 | チェック例外をスローできる | 実行後の結果と例外を処理します。 |
| 使用法 | 何を実行するかを定義します | タスクの結果を監視および取得する制御 |