从服务器端的一个处理程序
中考虑这个方法@Override
public void channelRead(final ChannelHandlerContext ctx, Object msg) throws Exception {
try {
io.netty.channel.ChannelFuture f = ctx.writeAndFlush("Executing command now...");
System.out.println("command execution future - " + f);
new Thread(new Runnable() {
int i = 4;
@Override
public void run() {
while(i >= 0 ) {
io.netty.channel.ChannelFuture f = ctx.writeAndFlush("beat till command");
System.out.println("beat till command future - " + f);
try {
Thread.sleep(6*1000);
i--;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
//assume some processing here
Thread.sleep(20 * 1000);
} catch (Exception e) {
e.printStackTrace();
}
ctx.fireChannelRead(msg);
}
在上面的代码中,当我写入同一线程中的通道时,它会立即发送到客户端,即此消息ctx.writeAndFlush("Executing command now...")
立即发送
但是当我从不同的线程尝试同样的事情时,它不会立即发送(ctx.writeAndFlush("beat till command")
)。未来DefaultChannelPromise@5aa824c(incomplete)
表明操作不完整。所有这些调用都是推迟的,我猜并在主线程完成后完成。为什么会这样? ctx上有些锁吗?
请告诉我,我在这里做错了什么?