Java中的CompletableFuture超時使用

banq發表於2018-08-28
我喜歡Java 8的CompletableFuture,但它有它的缺點: 慣用的超時處理就是其中之一。

幸運的是,JDK 9帶來了兩種新方法,可以為每個人提供渴望的功能 - 這對於確保在使用非同步處理時的正確彈性至關重要。

在這篇超短篇文章中,嘗試幫助大家對這個新API方法的認識。

CompletableFuture#orTimeout
簡單地說,在呼叫上述方法之後,如果未在指定的超時內完成,將來會丟擲ExecutionException。

一個簡單的例子:

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(this::computeEndlessly)
  .orTimeout(1, TimeUnit.SECONDS);

future.get(); // java.util.concurrent.ExecutionException after waiting for 1 second
<p class="indent">

由於設定了timeout為1秒,那麼在get那裡等待1秒後拋錯

CompletableFuturecompleteOnTimeout
在這種情況下,我們可以在達到超時後返回預設值:

CompletableFuture<Integer> future = CompletableFuture.supplyAsync(this::computeEndlessly)
  .completeOnTimeout(42, 1, TimeUnit.SECONDS);

Integer result = future.get(); // 42
<p class="indent">

超時1秒後不是報錯,而是返回了預設的42這個值,前提條件是你必須預設預設值。

就這麼簡單,雖然我不一定喜歡我們總是被迫預先計算預設值的事實。

完整原始碼:

github

CompletableFuture Timeouts in Java – { 4Comprehens

相關文章