Phương thức này được giới thiệu từ Java 9.
1 |
CompletableFuture<T> completeOnTimeout(T value, long timeout, TimeUnit unit) |
Phương thức này dùng để: nếu sau khoảng thời gian timeout mà tác vụ của chúng ta vẫn chưa xử lý xong, thay vì throw ra exception TimeoutException như phương thức orTimeout(), code của chúng ta sẽ trả về giá trị mà chúng ta truyền vào trong phương thức này.
Ví dụ sau mình muốn tính tổng của hai số và mình muốn nó hoàn thành trong 1s, nhưng bởi vì trong quá trình xử lý tác vụ, mình cho sleep 3s:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package com.huongdanjava.javaexample; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; public class Example { public static void main(String[] args) throws InterruptedException { int a = 2; int b = 5; CompletableFuture.supplyAsync(() -> { try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } return a + b; }) .completeOnTimeout(0, 1, TimeUnit.SECONDS) .thenAccept(result -> System.out.println(result)); TimeUnit.SECONDS.sleep(10); } } |
nên kết quả sẽ trả về giá trị mà mình đã truyền vào trong phương thức completeOnTimeout(), ở đây là 0:
Nếu bây giờ mình tăng khoảng thời gian timeout lên 4s:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package com.huongdanjava.javaexample; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; public class Example { public static void main(String[] args) throws InterruptedException { int a = 2; int b = 5; CompletableFuture.supplyAsync(() -> { try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } return a + b; }) .completeOnTimeout(0, 4, TimeUnit.SECONDS) .thenAccept(result -> System.out.println(result)); TimeUnit.SECONDS.sleep(10); } } |
thì kết quả sẽ là: