Netty ChannelHandlerContext 从不同线程写入

Netty ChannelHandlerContext writing from different thread

我正在使用 Netty 制作实时游戏,我有一个关于在 ChannelHandlerContext 上使用不同于 ChannelHandler 所在线程的 write 方法的问题。

我在 Java 应用程序中有一个单独的线程池,我将从数据库中提取并执行游戏逻辑。我想使用 BlockingQueue 将请求提交到不同的线程以传递玩家发送的 ChannelHandlerContext 和数据。然后该线程将基于此更改游戏状态。完成后,我希望能够使用 ChannelHandlerContext 写入方法将更改后的游戏状态写回给用户的响应。

如果我从单独的游戏逻辑线程执行此操作,我不希望写入函数给该线程带来负担。如果我从那里调用写入,它会生成自己的线程、使用游戏逻辑线程还是使用 ChannelHandler's 线程?

在这种情况下,将使用 ChannelHandler 线程。这是因为 ChannelHandlerContext.write 方法会检查你所在的线程。如果 ctx.write 方法是从外部线程(而不是事件执行线程)调用的,那么 ctx.write 操作将被提交给属于您的上下文的线程。

实际发生的事情可以简单地描述如下:

gameLogicPool.send(new Runnable() {
         //your logic here
         ctx.write(response);
         //ctx.write actually does this when executed from another thread:
         ctx.executor().execute(new Runnable() {
             //write happens here when you are in event executor already
             }
         );
    }
);