BIO的不合理

Java远古时代的BIO先天就无法支持多个客户端的连接
但是实际上对一个linux系统, 一个连接就是只是一个文件描述符而已, 而存储一个文件描述符成本是很低的

在BIO的世界里, 为客户端服务的线程绝大多数时间都是闲置的, 苦苦等待客户端发送的数据
显然,如果每多一个连接就非要新增一个线程去苦苦等待, 是不合理的

linux的进步

https://www.jianshu.com/p/722819425dbd

后来linux提供了 select(), poll(), epoll() 这样的系统调用
虽然三种方法有些区别, 但是与BIO最核心的区别就是: 允许一个线程去监听多个网络连接的不同网络事件
这里不讨论linux的网络编程

Java的变革

既然linux提供了api, 那么Java自然就能在语言和JDK层面支持
在Java1.4的时候出现了NIO的API