我看到以下代码(基于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
BTW,对于阻塞代码,netty还提供了一种更整洁的解决方案,如下所述:https://netty.io/4.1/api/io/netty/channel/ChannelPipeline.html(查找“ 正在构建管道
”)