CompletableFuture不能被打断

本文探讨了CompletableFuture在处理中断时的行为,指出CompletableFuture不会像标准Future那样中断基础线程,这可能导致意外的结果。文章通过测试说明,即使CompletableFuture被取消,相关后台线程仍可能继续运行,而不会抛出InterruptedException。作者警告,这种设计决策可能违反Liskov替换原则,对依赖其行为的应用造成影响。
摘要由CSDN通过智能技术生成

我已经写了很多有关InterruptedException和中断线程的文章 。 简而言之,如果您没有Future.cancel()调用Future.cancel()那么Future将终止待处理的get() ,但还将尝试中断基础线程。 这是一个非常重要的功能,可以更好地利用线程池。 我还写信总是比标准Future更喜欢CompletableFuture 。 事实证明,功能更强大的Future弟兄没有那么优雅地处理cancel() 。 考虑以下任务,我们稍后将在整个测试中使用以下任务:

class InterruptibleTask implements Runnable {
 
    private final CountDownLatch started = new CountDownLatch(1)
    private final CountDownLatch interrupted = new CountDownLatch(1)
 
    @Override
    void run() {
        started.countDown()
        try {
            Thread.sleep(10_000)
        } catch (InterruptedException ignored) {
            interrupted.countDown()
        }
    }
 
    void blockUntilStarted() {
        started.await()
    }
 
    void blockUntilInterrupted() {
        assert interrupted.await(1, TimeUnit.SECONDS)
    }
 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值