[英]Does Netty violate the contract of Future.cancel(…) method?
根据方法java.util.concurrent.Future#cancel
的合同:
此方法返回后,对isDone的后续调用将始终返回true。
Netty的Future界面扩展了它:
public interface Future<V> extends java.util.concurrent.Future<V>
所以Netty应该遵守合同。 但实际上Netty没有。 您可以运行此示例代码:
import io.netty.util.concurrent.GlobalEventExecutor;
import io.netty.util.concurrent.Promise;
public class DefaultPromiseIsDoneTest {
private final Promise<?> defaultPromise = GlobalEventExecutor.INSTANCE.newPromise();
public static void main(String args[]) {
DefaultPromiseIsDoneTest main = new DefaultPromiseIsDoneTest();
main.isDoneTest();
}
private void isDoneTest() {
defaultPromise.setUncancellable();
defaultPromise.cancel(false);
boolean isDone = defaultPromise.isDone();
System.out.println(isDone);
}
}
控制台应该打印:
真正
但事实上它打印:
假
以下方法也违反了合同:
io.netty.channel.group.VoidChannelGroupFuture#isDone
io.netty.channel.VoidChannelPromise#isDone
我已经在github上创建了一个问题: 问题
但我仍然想在stackoverflow中讨论这个问题,因为我认为这是Future
接口的cancel
和isDone
方法的一个非常基本的设计决策。
还有一些相关的主题:
java.util.concurrent.Future中的方法cancel()是否应该阻塞?
顺便说一句,我是Netty的粉丝:)
Netty确认了这个问题,请参考问题 。
我认为这个合同很可能在其他Java异步框架中被错误地实现。 因为当我们第一次阅读它时,它确实是一个违反直觉的合同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.