Java 9 thêm phương thức delayedExecutor() vào CompletableFuture. 2 overload:
delayedExecutor(long delay, TimeUnit unit): Trả về Executor dùng default executor của CompletableFuture sau delay.delayedExecutor(long delay, TimeUnit unit, Executor executor): Trả về Executor dùng executor truyền vào sau delay.
Executor trả về sẽ execute task sau khoảng delay chỉ định.
Cú pháp
public static Executor delayedExecutor(long delay, TimeUnit unit) public static Executor delayedExecutor(long delay, TimeUnit unit, Executor executor)
Ví dụ: Xử lý async sau 3 giây
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
public class DelayedExecutorMethodTest {
public static void main(String args[]) throws InterruptedException, ExecutionException {
CompletableFuture<String> future = new CompletableFuture<>();
future.completeAsync(() -> {
try {
System.out.println("inside future: processing data...");
return "tutorialspoint.com";
} catch(Throwable e) {
return "not detected";
}
}, CompletableFuture.delayedExecutor(3, TimeUnit.SECONDS))
.thenAccept(result -> System.out.println("accept: " + result));
for(int i = 1; i <= 5; i++) {
Thread.sleep(1000);
System.out.println("running outside... " + i + " s");
}
}
}
Kết quả
running outside... 1 s running outside... 2 s inside future: processing data... accept: tutorialspoint.com running outside... 3 s running outside... 4 s running outside... 5 s
Giải thích luồng chạy
- Main thread chạy vòng lặp in "running outside..." mỗi giây.
completeAsync(supplier, delayedExecutor(3s)): supplier chạy trên executor riêng sau 3 giây.- Sau 3 giây: supplier chạy → "inside future..." → trả về string.
thenAcceptconsume kết quả → in "accept: tutorialspoint.com".- Main thread tiếp tục in "running outside... 3/4/5 s".
Khi nào dùng delayedExecutor()?
- Retry với backoff: Thử lại operation sau delay tăng dần.
- Scheduled task nhẹ: Không cần
ScheduledExecutorServiceđầy đủ. - Timeout handling: Kết hợp với
orTimeout(),completeOnTimeout(). - Rate limiting: Delay giữa các batch processing.
- Testing: Mô phỏng latency network/service.
So sánh
| Cách | Ưu điểm | Nhược điểm |
|---|---|---|
Thread.sleep() | Đơn giản | Block thread hiện tại |
ScheduledExecutorService | Đầy đủ tính năng | Verbose, cần shutdown |
CompletableFuture.delayedExecutor() | Fluent API, non-blocking, composable | Chỉ dùng cho CompletableFuture pipeline |