美文网首页
关于Netty中线程的小结

关于Netty中线程的小结

作者: 知止9528 | 来源:发表于2019-01-14 07:35 被阅读2次

    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线程执行的,因此要注意的是不要在这里执行耗时操作.

    相关文章

      网友评论

          本文标题:关于Netty中线程的小结

          本文链接:https://www.haomeiwen.com/subject/magrdqtx.html