学了下NIO, 但是始终没搞明白它是怎么处理的,
怎么比BIO用更少的线程处理更多的请求,归纳了下,大概有这么几个问题:
1, nio是单线程处理所有客户端请求还是多线程处理?
2, 如果是单线程处理,若某个请求执行时间较长(比如在上传或下载文件)那么将会造成其他请求无法及时响应?
3, 如果是多线程处理,是每个请求对应一个线程, 还是多个请求对应一个线程?如果是多个请求对应一个线程,那么与BIO中 线程池+队列 的方式有何区别?
4, NIO是非阻塞的, 但ServerSocketChannel的accept()方法和Selector的select()方法都是阻塞的,到底是在哪里非阻塞呢?
用一个专门的线程就可以管理多个通道,也就是管理多个连接
一旦发现Channel有注册的事件发生,便可以逐个地对这些事件进行处理。
比如,某时刻客户端给服务端发送了一些数据,阻塞I/O会调用read()阻塞地读取数据,而NIO的服务端会在Selector中添加一个读事件,服务端的处理线程会轮询地访问Selector,如果访问Selector时有读事件到达,则处理该事件,如果没有则处理线程会一直阻塞直到读事件到达。
多路复用器是单线程的,他只是轮训的去查看有没有可以read的数据,如果有数据则可以使用多线程进行处理(线程池),这里的单线程说的是对IO的数据可达是单线程的。