此代码测试取消从可完成的未来创建的光纤,它失败了:
val toCancel = CompletableFuture.supplyAsync { () =>
Thread.sleep(20000)
()
}
val test =
for {
foo <- IO.fromCompletableFuture(IO(toCancel)).start
_ <- IO.sleep(1.second)
_ <- foo.cancel
} yield toCancel.isCancelled
assertIOBoolean(test)这是猫影响3虫,有工作吗?
发布于 2021-12-18 01:44:24
不,这不是虫子。
似乎你希望猫效应会中断Thread.sleep电话,但恐怕这是不可能的。CompletableFuture只是一个容器,希望在将来的某个时候可以得到这个结果。它不知道这个值可能来自哪里,或者哪个线程负责计算它,或者类似的任何东西。期望猫-效果“中断潜在的可完成的未来”(正如您在其中一条评论中所写)是没有意义的,因为CompletableFuture不是可以被打断的东西。这仅仅是一个存储结果的地方,一旦有了它。这也是为什么在cancel方法的文档中它说:
mayInterruptIfRunning -此值在此实现中没有影响,因为中断不用于控制处理。
如果您想要创建一个可以取消的IO,则不能从CompletableFuture创建它。
您可以尝试IO.interruptible,或者ASync.async。
https://stackoverflow.com/questions/70391337
复制相似问题