2017-06-27 27 views
0

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

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

如果我从单独的游戏逻辑线程做到这一点,我不希望写函数负担该线程。如果我从那里调用写入,它会产生它自己的线程,使用游戏逻辑线程,还是使用ChannelHandler's线程?

回答

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 
      } 
     ); 
    } 
); 
+0

确定。所以为了清楚地从另一个线程调用ctx.write将使用与我的通道相同的线程池,并且不会生成新线程或使用它当前所在的线程? –

+1

“与我的频道相同的线程池” - 正确。 –