簡體   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