为什么"多路复用,非阻塞I/O,[...]比面向线程的阻塞I/O更具可扩展性"?

Mad*_*sen 12 java io nonblocking blocking

我正在阅读JDK 7文档中的频道(这里),并偶然发现:

多路复用,非阻塞I/O,比面向线程更具可扩展性,阻塞I/O,[...]

关于为什么会这样,有一个简单的解释吗?

Ben*_*igt 6

因为线程堆栈通常比支持异步I/O连接所需的数据结构大得多.此外,调度数千个线程效率低下.

  • 这是通常的论点,但是:我可以在我的桌面计算机上运行数万个线程,但是我还没有看到任何问题,我可以从一台机器实际上提供数万个连接而不会一切都停止.所以这对我来说似乎是一个微弱的争论.另外NIO使用选择器进行非阻塞[通常不是一个很好的选择](http://www.mailinator.com/tymaPaulMultithreaded.pdf) (3认同)

Lou*_*man 3

“阻塞”意味着线程必须等待足够长的时间才能使资源变得可用......这意味着,根据定义,线程将等待资源。非阻塞避免了这种事情。

一般来说,非阻塞解决方案比较棘手,但它们避免了资源争用,这使得扩展更容易。(也就是说,这样做的目的Channel是让这件事变得不那么棘手。)