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

时间:2018-02-14 16:47:20

标签: java asynchronous netty future cancellation

根据方法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的粉丝:)。

1 个答案:

答案 0 :(得分:1)

Netty确认了此问题,请参阅issue

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