前言
在前面我們有講到,在使用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第一個參數和普通任務一樣,傳入一個線程即可,第二個參數是延時事件,第三個參數是延時單位,此處使用的是秒