关于Netty中线程的小结

2019-01-14  本文已影响2人  知止9528

1.一个EventLoopGroup当中会包含一个或者多个EventLoop.
2.一个EventLoop在它的整个生命周期中都只会与唯一一个Thread进行绑定
3.所有由EventLoop所处理的各种I/O事件都将在它所关联的那个Thread上进行处理
4.一个Channel在它的整个生命周期中只会注册在一个EventLoop上
5.一个EventLoop在运行过程当中,会被分配给一个或者多个Channel.

重要结论:
一:在Netty中,Channel的实现一定是线程安全的;基于此,我们可以存储一个Channel的引用,并且在需要向远程端点发送数据时,通过这个引用来调用Channel相应的方法;即使当时有很多线程都在使用它也不会出现多线程问题;而且,消息一定会按照顺序发送出去.

二:我们在业务开发中,不要将长时间执行的耗时任务放入到EventLoop的执行队列中,因为它将会一直阻塞该线程所对应的所有Channel上的其他任务,如果我们需要进行阻塞调用或是耗时的操作,可以使用一个专门的线程池来处理.

通常会有两种方法
1.在ChannelHandler的回调方法中,使用自己定义的线程池,这样就可以实现异步调用
2.借助于Netty提供的向ChannelPipeline添加ChannelHandler时调用的addLast方法来传递EventExecutor.

这个也说明了,默认情况下,调用addLast(handler),ChannelHandler中的回调方法都是由I/O线程执行的,如果调用ChannelPipeline addlast(EventExecutorGroup group,ChannelHandler...handler);方法,那么ChannelHandler中的回调方法就是由参数中的group线程组来执行的.

此外,JDK所提供的Future只能通过手工方式检查执行结果,而这个操作是会阻塞的;
Netty针对ChannelFuture进行了增强,通过ChannelFutueListener以回调的方式来获取执行结果,去除了手工检查阻塞的操作;

但同时ChannelFutureListener的operationComplete方法是由I/O线程执行的,因此要注意的是不要在这里执行耗时操作.

上一篇 下一篇

猜你喜欢

热点阅读