java - Netty 是否违反了 Future.cancel(...) 方法的约定?

标签 java asynchronous netty future cancellation

根据契约(Contract)的方法java.util.concurrent.Future#cancel :

After this method returns, subsequent calls to isDone will always return true.

Netty 的 Future 接口(interface)扩展了它:

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

但我仍然想在 stackoverflow 中讨论这个问题,因为我认为这是 cancel 的一个非常基本的设计决策。 & isDone Future 的方法界面。

还有一些相关的话题:

Future cancel method documentation

Whether method cancel() in java.util.concurrent.Future shoud be blocking?

顺便说一句,我是 Netty 的粉丝 :)

最佳答案

Netty确认了这个问题,请引用issue .

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

关于java - Netty 是否违反了 Future.cancel(...) 方法的约定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48792248/

相关文章:

java - 显示对象列表

javascript - 数据库查询功能未异步运行

java - 使用 Netty 在 Java 中实现 Finagle thrift 客户端服务器

java - 如何将 netty Channel 对象存储在 Redis 数据库或任何其他解决方案中?

java - Netty 的基本身份 validator

java - Java 中的字符串模式不匹配

java - 在java中通过特定单词解析Http响应?

java - CopyOnWriteArrayList 的行为

java - 异步任务和程序流程遇到问题

javascript - 如何从 Controller 调用嵌套在 promise 内的函数?