Netty剖析之Netty任务队列

前言

在前面我们有讲到,在使用Netty的时候,我们的业务处理都是放到我们自定义的handler里面,那么如果handler里面有一些执行比较耗时的操作的话,依旧会出现线程阻塞的情况,那么怎么来处理呢?我们可以回过头去看看Netty的模型图,里面有一块是TaskQueue,这个呢就是Netty提供给我们的任务队列,可以用来异步处理任务,它是和channel一一绑定的。

自定义普通任务

通过ChannelHandlerContext获取channel,通过channel获取eventLoop,然后调用execute方法即可放入到任务队列,代码如下:

Channel channel = ctx.channel();

channel.eventLoop().execute(new Runnable() {
    @Override
    public void run() {
        try {
            Thread.sleep(5000);
            ctx.writeAndFlush(Unpooled.copiedBuffer("自定义普通任务~", CharsetUtil.UTF_8));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
});

自定义定时任务

定时任务也大同小异,都是通过ChannelHandlerContext获取channel,通过channel获取eventLoop,然后调用schedule方法即放入到任务队列,代码如下:

channel.eventLoop().schedule(new Runnable() {
    @Override
    public void run() {
        ctx.writeAndFlush(Unpooled.copiedBuffer("自定义定时任务~", CharsetUtil.UTF_8));
    }
},5, TimeUnit.SECONDS);

schedule第一个参数和普通任务一样,传入一个线程即可,第二个参数是延时事件,第三个参数是延时单位,此处使用的是秒

发布了107 篇原创文章 · 获赞 19 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/chen_changying/article/details/104150419