【问题标题】:Does Netty violate the contract of Future.cancel(...) method?Netty 是否违反 Future.cancel(...) 方法的合同?
【发布时间】: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 中讨论这个问题,因为我认为这是 cancelisDone 接口的 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


【解决方案1】:

Netty 确认此问题,请参考issue

我认为这个契约很可能在其他 Java 异步框架中被错误地实现。因为当我们第一次阅读它时,它确实是一个违反直觉的合同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2016-06-18
    相关资源
    最近更新 更多