Cf08_ManualComplete.java 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. package space.anyi;
  2. import java.util.concurrent.CompletableFuture;
  3. public class Cf08_ManualComplete {
  4. public static void main(String[] args) throws Exception {
  5. // complete: 任务的完成时机由我们手动决定(比如等待外部事件/用户操作)
  6. CompletableFuture<String> gate = new CompletableFuture<>();
  7. new Thread(() -> {
  8. try {
  9. Thread.sleep(500);
  10. } catch (InterruptedException e) {
  11. e.printStackTrace();
  12. }
  13. gate.complete("外部线程触发了完成");
  14. }).start();
  15. System.out.println("阻塞等待手动完成: " + gate.join());
  16. // completeExceptionally: 手动让任务以异常结束,常用于"超时兜底"
  17. CompletableFuture<Integer> timeout = new CompletableFuture<>();
  18. timeout.completeExceptionally(new RuntimeException("调用超时,兜底结束"));
  19. try {
  20. timeout.join();
  21. } catch (Exception e) {
  22. System.out.println("completeExceptionally 抛给调用方: " + e.getCause());
  23. }
  24. // obtrudeValue: 无论之前是否已完成,强制覆盖为新值(慎用)
  25. CompletableFuture<String> forced = CompletableFuture.completedFuture("旧结果");
  26. forced.obtrudeValue("强制更新的结果");
  27. System.out.println("obtrudeValue 覆盖后: " + forced.join());
  28. // cancel: 取消任务, isCancelled 与 isCompletedExceptionally 都会为 true
  29. CompletableFuture<String> cancelling = new CompletableFuture<>();
  30. System.out.println("cancel() 返回值: " + cancelling.cancel(true));
  31. System.out.println("取消后 isCancelled: " + cancelling.isCancelled()
  32. + ", isCompletedExceptionally: " + cancelling.isCompletedExceptionally());
  33. }
  34. }