了解Netty对线程的使用

时间:2012-01-04 07:26:57

标签: java sockets netty

在netty中,流经通道管道的事件按顺序发生,因为每个通道实际上只分配给一个线程,并且每个处理程序依次相互调用。这是有道理的,可以减轻许多同步问题。

但是,如果您使用IdleStateHandler,则在我读取源代码时,似乎channelIdle事件将在Timers线程(HashedWheelTime正在使用的线程)的上下文中“处理”。

是这种情况还是我错过了什么?如果是这种情况,这是否意味着idlestate事件和IO事件(例如messageRecieved事件)可能同时在同一个通道上执行?

另外,因为我可以保存ChannelHandler ctx并在另一个线程中使用它来“写入”一个通道,因此也有一个事件在一个线程的下游和另一个线程的上游同时在同一频道?

最后ChannelFutures执行哪个线程?

所有这些用例都是完全可以接受的,而不是对Netty的批评,我实际上非常喜欢图书馆,并在各处使用它。只是当我尝试用它做更多更复杂的事情时,我想更多地了解它是如何在引擎盖下工作的,这样我就可以确保我使用正确且恰到好处的数量(不多也不少)同步(锁定)。

2 个答案:

答案 0 :(得分:4)

是的,可以同时触发channelIdle事件和下游/上游事件。因此,如果您的处理程序确实实现了三个中的至少两个,则需要添加适当的同步。我想我们应该在javadocs中说得更清楚..

现在其他问题..

您也可以从您想要的每个线程调用Channel.write(...)。因此可以将它存储在某处并随时调用write。这也给出了“限制”,你需要为“下游”处理程序正确同步。

ChannelFutures从工作线程中执行。

答案 1 :(得分:1)

  

但是,如果您使用IdleStateHandler,则在我读取源代码时,似乎channelIdle事件将在Timers线程(HashedWheelTime正在使用的线程)的上下文中“处理”。

     

是这种情况还是我错过了什么?如果是这种情况,这是否意味着idlestate事件和IO事件(例如messageRecieved事件)可能同时在同一个通道上执行?

是的,您错过了Netty中可用的有序事件执行的概念,如果您没有在管道中使用OrderedMemoryAwareThreadPoolExecutor执行ExecutionHandler,则无法执行有序事件执行,特别是来自IdleStateHandler的通道状态事件。

  

另外,因为我可以保存ChannelHandler ctx并在另一个线程中使用它来“写入”一个通道,因此也有一个事件在一个线程的下游和另一个线程的上游同时在同一频道?

是的,这是正确的。

更多,如果你想在下游执行命令事件,你有一个带有OrderedMemoryAwareThreadPoolExecutor的下游执行处理程序。

  

最后ChannelFutures执行哪个线程?

由Oio / Nio Worker线程执行,

但是如果您的下游流处理程序正在使用某种类型的事件并将另一种类型的事件触发到下游,那么您的下游处理程序可以选择处理将来的执行。这可以通过获取未来的表格下游事件并调用

来完成
future.setSuccess()