根据方法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上创建了一个问题:issue
但是我仍然想在stackoverflow中讨论这个问题,因为我认为这是cancel
&amp;的基本设计决策。 isDone
接口的Future
方法。
还有一些相关主题:
Future cancel method documentation
Whether method cancel() in java.util.concurrent.Future shoud be blocking?
顺便说一下,我是Netty的粉丝:)。