给 CompletableFuture 设了超时、调了 cancel,底层任务到底停没停?这篇用会计数的任务逐一验证(默认线程池的行为见后面的 CompletableFuture 默认执行器一篇)。
300 ms 后 join() 抛 TimeoutException;f.isCompletedExceptionally = true 超时时任务已执行 4 步;再过 1.2 秒已执行 15 步,任务被中断过吗:false(任务还在后台继续跑)
cancel(true) 返回 true,isCancelled = true,isDone = true join() 抛 CancellationException 依赖它的 thenApply 阶段 join() 抛 CompletionException,cause = CancellationException 取消时任务已执行 3 步;再过 1.2 秒已执行 15 步,任务被中断过吗:false(cancel(true) 的参数对 CompletableFuture 没有效果)
executor.submit 的 Future:cancel(true) 返回 true,任务被中断了吗:true;取消后 300 ms 时 3 步,再过 1 秒 3 步(不再增长) 组合写法:CompletableFuture 超时(TimeoutException)后,在 whenComplete 里对底层 Future 调 cancel(true) 底层任务被中断了吗:true;超时后 0.3 秒 3 步,再过 0.8 秒 3 步(不再增长)
completeOnTimeout:default(超时用默认值完成,没有异常) get(100ms) 抛 TimeoutException;之后 g.isDone = false(get 的超时只是不等了,future 本身没有被完成) 之后再 join() 得到:real