Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Khi nào dùng delayedExecutor() của CompletableFuture trong Java 9?

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

  1. Main thread chạy vòng lặp in "running outside..." mỗi giây.
  2. completeAsync(supplier, delayedExecutor(3s)): supplier chạy trên executor riêng sau 3 giây.
  3. Sau 3 giây: supplier chạy → "inside future..." → trả về string.
  4. thenAccept consume kết quả → in "accept: tutorialspoint.com".
  5. 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

delayedExecutor() làm cho CompletableFuture trở thành công cụ async scheduling mạnh mẽ hơn.

CáchƯu điểmNhược điểm
Thread.sleep()Đơn giảnBlock thread hiện tại
ScheduledExecutorServiceĐầy đủ tính năngVerbose, cần shutdown
CompletableFuture.delayedExecutor()Fluent API, non-blocking, composableChỉ dùng cho CompletableFuture pipeline