来自node.js背景,我很困惑,它在Netty中不像node.js那样是单线程的。 (NioServerSocketChannelFactory文档声明有老板线程和工作线程)
也许是因为与node.js不同,许多现有的Java库并不是异步的。但即使是这样,为什么不让用户根据需要创建线程呢?是不是更自然,在概念上与异步事件驱动架构保持一致?
答案 0 :(得分:5)
我对node.js和javascript的了解相对有限,但是由于javascript不支持多线程这一事实,node.js不受限制吗?
在Netty中使用boss和worker线程是为了能够利用多个处理器内核而无需运行多个进程。 JVM非常繁重,因此限制所需的实例数是有意义的。另外我怀疑操作系统在线程之间切换要比完整进程快得多。
Boss线程用于接受传入连接,但是连接的处理被传递给工作线程。我没有参考手,但我模模糊糊地记得Grizzly项目发布了一些性能结果,表明这比尝试接受传入连接更高效,并在同一个线程中处理这些连接。
接受的连接以循环方式在工作线程上进行负载平衡。除非您明确编写代码,否则工作线程不会相互交互。因此,工作线程模型与我对node.js的理解非常相似。
Netty通过提供允许应用程序通过线程池定义线程模型的机制来处理非异步库,该线程池独立于boss和工作线程。为了帮助这个,Netty还提供了一些自定义线程池,它们知道给定连接正在使用的内存资源,并且还可以保证连接生成的事件的顺序。但是,没有必要使用这些机制。应用程序可以免费使用最适合的任何线程模型。