即使业务逻辑是纯CPU操作,是否也需要在channelread方法中启动新线程来执行业务逻辑?

问题描述 投票:0回答:1

我看到以下代码(基于netty的服务器):

public class NettyServerHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        // Release IO thread
        AllChannelHandler.channelRead(() -> {
            // business logic...
            // response
            ctx.channel().writeAndFlush(new Object());
        });
    }
    // other code

}

这是AllChannelHandler#channelRead

public class AllChannelHandler {

    private static ThreadPoolExecutor executor = new ThreadPoolExecutor(8, 8, 1, TimeUnit.MINUTES,
            new SynchronousQueue<>(), new ThreadPoolExecutor.CallerRunsPolicy());


    public static void channelRead(Runnable r) {
        executor.execute(r);
    }

}

如果业务逻辑是IO操作,则启动一个新线程来执行此操作很容易理解。

但是我想知道是否有必要在channelread方法中启动新线程来执行业务逻辑,即使业务逻辑是纯CPU操作吗?

java netty
1个回答
0
投票

如果您的业务逻辑正在执行阻塞IO,那么您必须在另一个线程中执行此操作以避免阻塞事件循环。

但是,如果您有一个非阻塞API(例如,当IO操作基于NIO时,则不必阻塞线程,也不需要新线程-您需要继续。)>

我在此处解释了如何在Netty中完成此操作:https://stackoverflow.com/a/54722136/382683

BTW,对于阻塞代码,netty还提供了一种更整洁的解决方案,如下所述:https://netty.io/4.1/api/io/netty/channel/ChannelPipeline.html(查找“ 正在构建管道

”)
© www.soinside.com 2019 - 2024. All rights reserved.