将来は、非同期実行結果を用いて得ることができます
Future<String> future = executor.submit(task);
String result = future.get();
私たちは、非同期実行結果を取得するには、Get()を使用する場合でも、このメソッドはブロックすることがあります。私たちは、非同期の結果が完了しているかどうかを判断するために)isDone(でwhileループを繰り返し呼び出します。
while(!future.isDone()){
Thread.sleep(1);
}
String result = future.get()
その非同期実行結果を使用して得られた未来は二つの方法があります。
- メソッドgetを遮断する1.コール()
- 2. isDoneの世論調査()
これらの2つの方法は、自動的に非同期タスクが完了したときに我々が期待する結果を返すので、JDKがCompletableFutureインタフェースを提供し、非常に良いものではありません。
CompletableFutrueインタフェース
タスクの実行が終了したとき、我々はCompletableFutureインタフェースを使用すると、自動的に優れたコールバック関数を設定するために、私たちを呼び出します。例外がタスクを発生した場合、それはまた、自動的に優れた別のコールバック関数を設定するために私たちを呼び出すことができます。
CompletableFuture<String> cf = getCompletableFutureFromSomewhere();
cf.thenAccept(new Consumer<String>(){ //thenAccept传入一个回调对象,就可以获得正常运行的异步结果
public void accept(String result){
System.out.println("正常运行获得异步结果:"+ result);
}
});
cf.exceptionally(new Function<Throwable, String>(){ //用exceptionally传入一个回调对象,可以获得运行时发生异常的情况
public String apply(Throwable, String){
System.out.println("运行发生异常:"+ t.getMessage());
return null;
}
});
新しい機能がさらに簡単な構文コードすることができJava8使用
CompletableFuture<String> cf = getCompletableFutureFromSomewhere();
cf.thenAccept( (result) -> {
System.out.println("正常运行获得异步结果");
});
cf.exceptionally( (t) -> {
System.out.println("运行时发生异常:" + t.getMessage());
return null;
});
CompletableFutureの利点:
- 非同期タスク、自動的にオブジェクトのコールバックメソッドの終わりに
- 非同期タスクのエラー、オブジェクトは自動的にコールバックメソッド
- メインスレッドは非同期タスクの実装についてはもはや心配コールバックを設定した後
CompletableFuture基本的な使い方:
CompletableFuture<String> cf = CompletableFuture.supplyAsync("异步执行实例");
cf.thenAccept("获得结果后的操作");
cf.exceptionally("发生异常时的操作");