我正在用Netty做一个实时游戏,我有一个问题,那就是在一个不同于ChannelHandler所在线程的ChannelHandlerContext上使用write方法。
我在Java应用程序中有一个单独的线程池,我将在其中从数据库中提取数据并执行游戏逻辑。我想使用BlockingQueue向不同的线程提交请求,以传递播放器发送的ChannelHandlerContext和数据。然后,该线程将基于此对游戏状态进行更改。完成后,我希望能够使用ChannelHandlerContext write方法将更改后的游戏状态的响应写回给用户。
如果我从单独的游戏逻辑线程执行此操作,我不希望写入函数对该线程造成负担。如果我从那里调用write,它会产生自己的线程,使用游戏逻辑线程,还是使用ChannelHandler's线程?
发布于 2017-06-28 00:42:21
在这种情况下,将使用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
}
);
}
);https://stackoverflow.com/questions/44782682
复制相似问题