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

标签 java netty

我看到以下代码(基于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操作?

最佳答案

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

但是如果你有一个非阻塞API(比如当IO操作基于NIO时),你就不必阻塞线程,也不需要新线程——你需要延续。

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

顺便说一句,对于阻塞代码,netty 还提供了一个更简洁的解决方案,如下所述:https://netty.io/4.1/api/io/netty/channel/ChannelPipeline.html (查找“构建管道”)

关于java - 即使业务逻辑是纯CPU操作,是否也需要在channelread方法中启动一个新线程来执行业务逻辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59597316/

相关文章:

java - 在 swt 中实现垂直侧边栏菜单?

sockets - Channel.isActive() 如何在 netty 中工作?

java - 在Java中读取little-endian 64位 float

java - 由于将请求从老板线程传递到工作线程而导致的 netty 延迟?

java - 写入客户端 channel 时出现异常 java.nio.channels.ClosedChannelException

Java > JSch.如何从设置文件获取 SFTP 连接的属性?

java - 如何从字符串从 Kotlin 类转换为接口(interface)/类?

java - 创建一个简单的库存程序 - 第二次尝试

java - 如何修改抽象数据类型(ADT)堆栈?

java - Netty IO 从类外部写入服务器