6

私の問題は、Completable Future の使い方です。

Callable を実装するクラスがあります。

public class Executor implements Callable<Collection>

以前は行うために使用されます-

service.submit(collectorService);

を返しますFuture<Collection>。ただし、 future はもう使用したくないので、 が必要CompletableFutureです。1 つのアイデアは、CompletableFuture でポーリングする必要がなく、準備が整うまで待機してブロックする必要がないということです。

では、どうすれば完了可能な未来を使用し、スレッドが終了isDone()したときに関数を呼び出すことができますか。callable

4

4 に答える 4

8

を指定するとCompletableFuture<T> f、同期または非同期のタスクを開始して、完了時に実行することができます。

f.thenApply(result -> isDone(result));      // sync callback
f.thenApplyAsync(result -> isDone(result)); // async callback

...または、結果が必要ない場合:

f.thenRun(() -> isDone());
f.thenRunAsync(() -> isDone());
于 2015-03-09T13:32:26.933 に答える
2

既存の CollectorService を呼び出すラムダ式を作成できます。CompletableFuture.supplyAsync が受け入れる Supplier ラムダ式は、次のようになります。

 Supplier<Collection> supplier = () -> collectorService.call();

そして、次のように CompletableFuture で使用できます

  CompletableFuture.supplyAsync(() -> collectorService.call(),service)
         .thenApply(collection->isDone(collection);

他の人が指摘しているように、thenApply は、collectorService.call() メソッドが結果を返したときに実行されます - Future タスクを実行したのと同じスレッドで。thenApplyAsync を使用すると、別のタスクが executor サービスに再送信されます (生のパフォーマンスは約 1 桁遅くなるため、正当な理由がない限り、これを実行しないでください!)。

于 2015-09-18T11:22:52.763 に答える
1

私があなたを正しく理解していれば、CompletableFuture を返す「タスク」(以前の「Executor」) を送信する方法を知りたがっています。

これを行うには、次のように呼び出します。

CompletableFuture.supplyAsync(collectorService)

違いは、「Executor」が Callable ではなく Supplier を実装する必要があることです。

于 2015-03-09T20:05:42.393 に答える