从不同的线程

时间:2017-06-27 14:18:29

标签: java multithreading netty

我正在使用Netty进行实时游戏,我有一个问题是在ChannelHandlerContext来自与ChannelHandler不同的线程中使用write方法。

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

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

1 个答案:

答案 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
             }
         );
    }
);