Java 21 发布一年了,http 、websocket 、grpc 对虚拟线程支持的框架都有了。但是 netty 官方明确表示为了兼容 java11 ,不会支持虚拟线程( https://github.com/netty/netty/issues/12816 )。 所以现在想用虚拟线程写个 tcp 服务,只能用 jdk 自带的库了么?有没有好写一点的框架。
虽然 netty 不会去全盘的换虚拟线程,但是 EventLoopGroup 可以自定义一个 ThreadFactory 在里面起虚拟线程,然后 channelRead0 里面如果有耗时操作也起一个虚拟线程去搞就行了,我是这么干的: https://github.com/codingmiao/hppt/blob/main/run/src/main/java/org/wowtools/hppt/common/util/NettyObjectBuilder.java 然后我觉得虚拟线程整个体系还在起步阶段,比如 WebFlux 对比虚拟线程加持的 springboot 还是有一点点性能优势的,虚拟线程对比现有的响应式写法最大的优势是在性能没有拉下太多的前提下大幅降低了开发难度。jdk 官方也说了会逐步干掉响应式编程,或许到下一个 LTS 版本,netty 看环境成熟了也会走虚拟线程的。
建议 netty 的提供的 eventLoop 线程只做 cpu 操作,如编解码,指令匹配等,一些业务操作还是要放在自定义线程池中,不要阻塞 eventloop 线程,而自定义的业务线程池可以使用虚拟线程。
netty 支持虚拟线程有啥实际意义,虚拟线程协程之类的最大意义本来就是在用同步语法写异步逻辑,netty 就不可能再改回来变成同步语法否则也就不是 netty 了,还不说虚拟线程在线程上又多了一层调度器除了白白损失性能对 netty 意义不大吧,netty 的 Handler 本来就不应该有同步 io 操作,否则用 netty 这麻烦的说不是对此一举,有需要同步 io 操作本来就应该放到独立 executor 中去,这独立 executor 完全就可以是虚拟线程的啊