
验证Netty服务端线程
发布日期:2021-05-18 06:39:16
浏览次数:13
分类:精选文章
本文共 2167 字,大约阅读时间需要 7 分钟。
Netty线程处理机制简解
在Netty的服务器开发中,处理请求和返回响应的线程机制是一个关键问题。本文将从理论到实践,详细解析Netty中Handler的线程执行情况。
默认线程机制 Netty的默认线程处理机制非常简洁。无论是输入Handler、输出Handler,还是内置的HeadContext,所有操作都由同一个IO线程执行。这个线程是由EventLoop负责,用户在使用Netty时无需手动指定。
代码示例 以下代码展示了一个基本的EchoServer:
EventLoopGroup bossGroup = new NioEventLoopGroup(1);EventLoopGroup workerGroup = new NioEventLoopGroup();ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(bossGroup, workerGroup) .channel(NioServerSocketChannel.class) .handler(new LoggingHandler(LogLevel.INFO)) .childHandler(new ChannelInitializer() { protected void initChannel(NioSocketChannel ch) { ChannelPipeline pipeline = ch.pipeline(); pipeline.addLast(new StringDecoder()); pipeline.addLast(new StringEncoder()); pipeline.addLast(new ServerOutHandler()); pipeline.addLast(new ServerInHandler()); } });ChannelFuture future = serverBootstrap.bind("127.0.0.1", 8080).sync();future.channel().closeFuture().sync();
在这个代码中,ServerInHandler和ServerOutHandler的方法都在IO线程执行。
线程检测 通过查看Handler中的日志,可以确认线程信息:
ServerInHandler:
@Slf4j@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception { System.out.println("ServerInHandler: " + Thread.currentThread().getName()); ctx.channel().writeAndFlush("蜀道之难");}
ServerOutHandler:
@Slf4j@Overridepublic void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { System.out.println("ServerOutHandler: " + Thread.currentThread().getName()); ctx.write(msg, promise);}
HeadContext内部:
@Overridepublic void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { System.out.println("HeadContext: " + Thread.currentThread().getName()); unsafe.write(msg, promise);}
由此可见,所有Handler方法均在IO线程中执行。
线程池指定 如果要手动指定线程,需要在Handler中使用ThreadFactory或线程池。例如,改动后的输出Handler:
@Slf4j@Overridepublic void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) { System.out.println("ServerOutHandler: " + Thread.currentThread().getName()); ctx.write(msg, promise);}
此时,输出Handler的线程将与输入Handler不同。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年05月09日 19时55分48秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Flex 布局的自适应子项内容过长导致其被撑大问题
2019-03-09
PL/SQL 动态Sql拼接where条件
2019-03-09
【自学Flutter】4.1 Material Design字体图标的使用(icon)
2019-03-09
【换行符】什么时候用cin.get()吃掉输入流中的换行符
2019-03-09
广东外语外贸大学第三届网络安全大赛Writeup
2019-03-09
SpringBoot使用RedisTemplate简单操作Redis的五种数据类型
2019-03-10
Thymeleaf sec:authorize 标签不生效
2019-03-11
微信JS-SDK DEMO页面和示例代码
2019-03-11
一张图搞定RPC框架核心原理
2019-03-11
他来了他来了,他带着云栖大会的免费门票走来了
2019-03-11
获取linux 主机cpu类型
2019-03-11
Flask--简介
2019-03-11
16 python基础-恺撒密码
2019-03-11
Frame--Api框架
2019-03-11
Boostrap技能点整理之【网格系统】
2019-03-11
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
2019-03-11
Git简单理解与使用
2019-03-11
echarts 基本图表开发小结
2019-03-11