第二章 NIO入门
传统BIO编程:
Java BIO(Blocking IO),是阻塞式IO。
采用BIO模式的网络连接,需要先在服务端启动一个ServerSocket进行监听,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程响应,如果没有则会一直等待或者遭到拒绝请求,如果有的话,客户端线程会等待请求结束后才继续执行。
采用BIO通信模型的服务端,由一个独立的Acceptor线程负责监听客户端的连接,每一个客户端的连接会创建一个对应的线程进行处理,处理完成后线程销毁。
每有一个新客户端请求接入就要创建一个新的线程处理客户端连接,传统BIO无法满足高性能、高并发的场景。
伪异步I/O编程:
为了改进一线程对应一连接模型,通过线程池或者消息队列来处理多个客户端的请求接入,线程池线程数N,客户端个数M,M可以远远大于N,可以通过线程池灵活地调配线程资源,防止海量并发接入导致线程耗尽。
伪异步I/O具体实现:伪异步I/O模型将客户端的socket封装成一个Task投递到后端的线程池中进行处理,JDK的线程池维护一个消息队列和N个活跃线程,对消息队列中的任务进行处理。
由于线程池和消息队列都是有界的,无论客户端并发连接数多大,都不会导致线程个数过于膨胀或内存溢出。
伪异步I/O的读和写操作都是同步阻塞的,仅仅只是对BIO线程模型的一个煎蛋优化,无法解决同步I/O导致的通信线程阻塞问题。</