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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章