Netty 是否违反了 Future.cancel(...) 方法的约定?
Does Netty violate the contract of Future.cancel(...) method?
根据合同方法 java.util.concurrent.Future#cancel
:
After this method returns, subsequent calls to isDone will always
return 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);
}
}
控制台应该打印:
true
但实际上它打印:
false
以下方法也违反约定:
io.netty.channel.group.VoidChannelGroupFuture#isDone
io.netty.channel.VoidChannelPromise#isDone
我已经在 github 上创建了一个问题:issue
但我仍然想在 Whosebug 中讨论这个问题,因为我认为这是 Future
接口的 cancel
和 isDone
方法的一个非常基本的设计决策。
还有一些相关话题:
顺便说一下,我是 Netty 的粉丝:)
Netty确认了这个问题,请参考issue。
我认为这个契约很可能在其他 Java 异步框架中被错误地实现。因为当我们第一次阅读它时,它确实是一个违反直觉的合同。
根据合同方法 java.util.concurrent.Future#cancel
:
After this method returns, subsequent calls to isDone will always return 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);
}
}
控制台应该打印:
true
但实际上它打印:
false
以下方法也违反约定:
io.netty.channel.group.VoidChannelGroupFuture#isDone
io.netty.channel.VoidChannelPromise#isDone
我已经在 github 上创建了一个问题:issue
但我仍然想在 Whosebug 中讨论这个问题,因为我认为这是 Future
接口的 cancel
和 isDone
方法的一个非常基本的设计决策。
还有一些相关话题:
顺便说一下,我是 Netty 的粉丝:)
Netty确认了这个问题,请参考issue。
我认为这个契约很可能在其他 Java 异步框架中被错误地实现。因为当我们第一次阅读它时,它确实是一个违反直觉的合同。