繁体   English   中英

Netty是否违反了Future.cancel(...)方法的合同?

[英]Does Netty violate the contract of Future.cancel(…) method?

根据方法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上创建了一个问题: 问题

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

还有一些相关的主题:

未来的取消方法文档

java.util.concurrent.Future中的方法cancel()是否应该阻塞?

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

Netty确认了这个问题,请参考问题

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM