【发布时间】:2018-07-25 07:47:53
【问题描述】:
根据方法java.util.concurrent.Future#cancel的合约:
此方法返回后,后续对 isDone 的调用将始终 返回真。
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 和 isDone 接口的 Future 方法的一个非常基本的设计决策。
还有一些相关的话题:
Future cancel method documentation
Whether method cancel() in java.util.concurrent.Future shoud be blocking?
顺便说一句,我是 Netty 的粉丝 :)
【问题讨论】:
-
有趣的是
cancel()是这样指定的。如果isDone()未完成且未取消,则返回 true 似乎很违反直觉。 -
@shmosel 是的,不过是Java做的契约,也可以合理解释,参考@Marko Topolnik的回答:stackoverflow.com/questions/28691081/…
标签: java asynchronous netty future cancellation