gpt4 book ai didi

netty - 在netty中不间断地等待

转载 作者:行者123 更新时间:2023-12-04 06:05:14 24 4
gpt4 key购买 nike

我认为 awaitUninterruptibly 意味着阻止代码执行直到操作完成,但似乎不是这样:

public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
ChannelFuture f = e.getChannel().close();
f.awaitUninterruptibly(); // ok, not netty i/o thread, I use a Execution Handler
System.out.println("bbb " + System.currentTimeMillis());
}
public void channelDisconnected(ChannelHandlerContext ctx, ChannelStateEvent e) {
System.out.println("aaa " + System.currentTimeMillis());
}

我发现“bbb”在“aaa”之前执行,如果我转到 Debug模式并逐行执行,“aaa”在“bbb”之前,因为代码执行速度变慢了。我误解了 awaitUninterruptible 吗?

await 只对当前线程有效,但使用 ExectionHandler 或线程池工作线程,关闭可能由另一个线程执行,所以 await 没用。它需要添加 ChannelFutureListener 来执行此操作。

最佳答案

I/O 工作线程在 channel 关闭后立即发出 future 信号,然后继续处理回调。在这种情况下,您的线程池线程在 I/O worker 能够触发相关的断开连接、未绑定(bind)和关闭事件之前被重新调度。当您通过调试器运行时,您正在更改线程的调度方式。

通常,future 用于确定请求的操作何时完成,而不是确定可能由操作完成触发的任何其他操作也已完成。

看看https://github.com/netty/netty/blob/master/src/main/java/io/netty/channel/socket/nio/NioWorker.java特别是用于确切逻辑的 void close(NioSocketChannel channel, ChannelFuture future) 方法。

关于netty - 在netty中不间断地等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8441938/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com