我ExecutorService
在 Java 中使用創建一個執行緒池,其中每個執行緒執行一些異步任務/呼叫另一個服務。我不想等待回應,而是在回應到達時回傳回應。
ExecutorService executor = Executors.newFixedThreadPool(5); // Class var
// Method
Future<Object> future = executor.submit(new TransportService(requestVO));
Object response = future.get(5, TimeUnit.SECONDS); // blocking
這樣做會等待第一個請求完成,然后回傳結果。問題是第二個請求必須等待第一個請求的回應回來,然后才處理。如果我使用 CompletableFuture 的supplyAsync()
方法,也會發生同樣的事情,因為我也必須使用它join()
來獲取回應。
我希望所有請求都能通過并在到達時回傳回應。這是可以實作的嗎?流仍然需要同步。
uj5u.com熱心網友回復:
您可能可以使用 aCompletableFuture
將異步任務提供給ExecutorService
:
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> "foo", Executors.newSingleThreadExecutor());
future.thenAccept(s -> System.out.println("done: " s));
CompletableFuture
有多種then...
方法可以在完成時鏈接后續操作。
uj5u.com熱心網友回復:
您需要在集合中添加期貨,然后在最后呼叫 join/get。
Collection<Future<Object>> futures = new ArrayList<>();
// schedule calls independantly
for(Request vo: requests) {
futures.add(executor.submit(new TransportService(requestVO)));
}
// actually handle result
for(Future<Object> future: futures) {
Object response = future.get(5, TimeUnit.SECONDS);
}
在這種情況下,您最多可以安排五個作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/318809.html
上一篇:AsyncFunction().GetAwaiter().GetResult()和Task.Run(()=>AsyncFunction).GetAwaiter().GetResult()有什么區
下一篇:返回列表