Phương thức này được giới thiệu từ Java 9.
1 |
CompletableFuture<T> orTimeout(long timeout, TimeUnit unit) |
Phương thức này dùng để chỉ định, nếu tác vụ của chúng ta không hoàn thành trong khoảng thời gian nào đó thì chương trình sẽ dừng và bị exception TimeoutException.
Ví dụ sau mình muốn việc tính tổng hai số sẽ hoàn thành trong thời gian 1s nhưng trong quá trình tính tổng 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 27 28 29 30 |
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; }) .orTimeout(1, TimeUnit.SECONDS) .whenComplete((result, exception) -> { System.out.println(result); if (exception != null) exception.printStackTrace(); }); TimeUnit.SECONDS.sleep(10); } } |
Kết quả:
Nếu bây giờ mình tăng thời gian timeout lên:
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 27 28 29 30 |
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; }) .orTimeout(4, TimeUnit.SECONDS) .whenComplete((result, exception) -> { System.out.println(result); if (exception != null) exception.printStackTrace(); }); TimeUnit.SECONDS.sleep(10); } } |
thì chương trình sẽ không bị lỗi nữa.