我正在使用Netty进行实时游戏,我有一个问题是在ChannelHandlerContext
来自与ChannelHandler
不同的线程中使用write方法。
我在Java应用程序中有一个单独的线程池,我将从数据库中提取并执行游戏逻辑。我想使用BlockingQueue
向不同的线程提交请求以传递ChannelHandlerContext
和玩家发送的数据。然后该线程将基于此更改游戏状态。完成之后,我希望能够使用ChannelHandlerContext
写入方法将更改后的游戏状态的用户回复给用户。
如果我从单独的游戏逻辑线程执行此操作,我不希望写入函数给该线程带来负担。如果我从那里调用write,它会生成它自己的线程,使用游戏逻辑线程,还是使用ChannelHandler's
线程?
答案 0 :(得分:1)
在这种情况下,将使用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
}
);
}
);