21

Future の戻り値の型を持つ春の @Async タスクを実装しようとしていますが、適切に行う方法がわかりません。

  1. そうすることで何が得られますか?タスクを停止して実行できるように、タスクを制御できるようになりますか?
  2. 私がそれを行う方法に関する参照実装はありますか? springsource は何も提供していません。

編集

スプリング ソースとスプリング リファレンス マニュアルから:

値を返すメソッドでさえ、非同期で呼び出すことができます。ただし、そのようなメソッドには Future 型の戻り値が必要です。これでも非同期実行の利点が得られるため、呼び出し元はその Future で get() を呼び出す前に他のタスクを実行できます。

そして、それは次のような例を示します:

@Async
Future<String> returnSomething(int i) {
// this will be executed asynchronously
}

これを正しく実装するには?

4

3 に答える 3

2

ExecutorService は Callable をスケジュールし、Future オブジェクトを返すことができます。Future は、利用可能になった結果を含むプレースホルダーです。結果があるかどうかを確認したり、タスクをキャンセルしたり、ブロックして結果を待つことができます。Future は、タスクから何らかのオブジェクト/値を期待している場合にのみ役立ちます。

Future 呼び出しを行う正しい方法は次のとおりです。

Future<Integer> futureEvenNumber = executorService.submit(new NextEvenNumberFinder(10000));

// Do something.

try {
   Integer nextEvenNumber = futureEvenNumber.get();
} catch (ExecutionException e) {
   System.err.println("NextEvenNumberFinder threw exception: " + e.getCause());
}

NextEvenNumberFinder クラス:

public class NextEvenNumberFinder implements Callable<Integer> {
private int number;

public NextEvenNumberFinder(int number) { this.number = number; }

@Override
public Integer call() throws Exception {
    for (;;)
        if (isEvenNumber(++number)) return number;
}

}

Spring Integration リファレンス マニュアル: http://static.springsource.org/spring-integration/reference/htmlsingle/

于 2013-06-22T11:50:41.790 に答える