เมธอด delayedExecutor() ถูกเพิ่มในคลาส CompletableFuture ใน Java 9 CompletableFuture กำหนดเมธอด delayedExecutor() 2 รูปแบบ (overloaded): เมธอดแรกคืน Executor object จาก default Executor object ที่ CompletableFuture ใช้รัน task หลัง delay และ new Executor object สามารถรัน task execution ได้ ส่วนเมธอดที่สองคืน Executor object เช่นกัน แต่เป็น Executor object ที่เราส่งเข้าไปในเมธอดหลัง delay และ new Executor object ก็สามารถรัน task execution ได้เช่นกัน
ไวยากรณ์
public static Executor delayedExecutor(long delay, TimeUnit unit, Executor executor)
public static Executor delayedExecutor(long delay, TimeUnit unit)
ตัวอย่างการใช้งาน
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++) {
try { Thread.sleep(1000); }
catch(InterruptedException e) { e.printStackTrace(); }
System.out.println("running outside... " + i + " s");
}
}
}
ผลลัพธ์
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
การทำงาน
- โค้ดนอกลูป (main thread) รันทุก 1 วินาที พิมพ์ "running outside..."
- completeAsync รัน task ใน delayedExecutor หลังจาก 3 วินาที
- task พิมพ์ "inside future..." แล้วคืนค่า
- thenAccept รับค่าและพิมพ์ "accept: ..."
- main thread ยังคงทำงานต่อไปไม่ได้ block
เมื่อไหร่ควรใช้
- ต้องการรัน task แบบ async หลังจาก delay ระยะเวลาหนึ่ง
- ไม่ต้องการ block thread หลักขณะรอ
- ต้องการใช้ executor เฉพาะ (custom thread pool) สำหรับ delayed task
- ต้องการ chain กับ thenAccept, thenApply, thenCompose ต่อ
delayedExecutor() ให้ทางเลือกที่สะดวกกว่า ScheduledExecutorService สำหรับงาน delay แบบ one-shot