1.普通io 同步阻塞 socket.read 没有返回信号 不知道数据有没有到达 如果没到达就一直阻塞 直到准备就绪 继续执行下去 ,所以当阻塞时,线程也释放不了,一直占用资源 。一个socket对应一条线程 (比如监听2个端口的Serversocket 就要建立2条线程) 所以 普通io 采用多线程阻塞,线程很多,jdk1.5以后默认线程栈1M,假如所有线程阻塞 ,释放不了, 那么多线程 占用资源很恐怖。。。
2.nio 多路复用 一条线程管理多个socket(比如说 一个selector 管理多个Serversocket) , 其实也是同步的,如果管理的socket数据都准备好了,selector.select同时只能返回一个socket的数据 其他准备好也只能等着,所以是阻塞的,如果没数据返回0继续轮询 , 在接收信号--》获取要的资源--》资源处理 整个逻辑中 比如管理2个ServerSocket ,2个数据都准备好了,但是selector.select返回的count只是1,然后获取其中一个socket数据 处理你想要处理的逻辑 然后结束 ,轮询获得另一个ServerSocket 的数据再出理。。。。。。就这样想串行一反复进行。你看起来好像在速度上比普通io速度慢,但是他只用一条线程去管理,那安全性资源性大大减少,所以nio 适合 多个短连接的业务,如果其中一个socket处理的业务逻辑很长,那别的socket数据准备好了也只能等着,直到这个结束 继续轮询。