前言
在前面我们有讲到,在使用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第一个参数和普通任务一样,传入一个线程即可,第二个参数是延时事件,第三个参数是延时单位,此处使用的是秒