netty:netty执行耗时任务的思考

8 篇文章 0 订阅

netty执行耗时任务时要放在【eventLoop().execute(runnable)】里面。
示例代码:

@Override
protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) {
    CharSequence charSequence1 = msg.readCharSequence(msg.readableBytes(), StandardCharsets.UTF_8);
    log.info("MyServerChannelInBoundHandler1.channelRead0[" + ctx.channel().remoteAddress() + "]:" + charSequence1);
    ByteBuf wbuf = Unpooled.copiedBuffer(charSequence1, StandardCharsets.UTF_8);

    AtomicLong tid1 = new AtomicLong(Thread.currentThread().getId());
    AtomicLong tid2 = new AtomicLong();

	// 注意这里
    ctx.channel().eventLoop().execute(new Runnable() {
        @Override
        public void run() {
            try {
                tid2.set(Thread.currentThread().getId());
                if( Objects.equals(tid1.get(), tid2.get()) ){
                    log.info("equals(tid1, tid2)");		// 经测试,基本进入的都是这个分支
                } else {
                    log.info("not equals(tid1, tid2)");
                }
                log.info("channelRead0, runnable 1: start, tid2={}", tid2.get());
                Thread.sleep(1000L);
                ctx.writeAndFlush(wbuf);
                log.info("channelRead0, runnable 1: end, tid2={}", tid2.get());
            } catch (InterruptedException e) {
            }
        }
    });
}

本质上来讲【eventLoop().execute(runnable)】仍然是在【workerEventLoopGroup】里面执行,但是netty会先将所有的网络缓冲里面的数据取完,然后触发很多的【channelRead0()】执行很多的【eventLoop().execute(runnable)】,这样【workerEventLoopGroup】里面的线程就可以执行比较满的任务了。
但是如果是在【channelRead0()】里面执行耗时任务,因为耗时任务阻塞了执行线程,【workerEventLoopGroup】里面就不会有很多的任务被同时执行,整个系统的性能就比较差了。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

A圳技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值