[英]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
接口的cancel
和isDone
方法的一個非常基本的設計決策。
還有一些相關的主題:
java.util.concurrent.Future中的方法cancel()是否應該阻塞?
順便說一句,我是Netty的粉絲:)
Netty確認了這個問題,請參考問題 。
我認為這個合同很可能在其他Java異步框架中被錯誤地實現。 因為當我們第一次閱讀它時,它確實是一個違反直覺的合同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.