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
}
);
}
);
我正在使用 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
}
);
}
);