传统java网络编程中,服务端创建serversocket,为每个客户端单独创建一个线程thread,分别处理请求。对cpu来说,线程开销很大,无限创建线程让操作系统崩溃。
在系统启动时创建一个动态的线程池。但是在高并发情况下不太乐观。当线程池大小超过cpu瓶颈时,就极其地下了。
在jdk4后,引入nio,即非阻塞IO。无需多个线程,仅仅一个线程,即可处理全部客户端,解决了性能和并发的两个问题。
NIO采用通道(channel)和选择器(Selector)的核心对象,select机制。不为每个客户端连接新启线程处理,而是将其注册到selector对象上。可在单线程利用selector对象管理
大量并发连接。不要求阻塞等待IO操作即可返回,减少管理io连接导致的系统开销。
当有读或写等任何注册的事件发生时,可从selector中获得selectionKey,从selectionKey中可以找到发生的事件和该事件所发生的具体的SelectableChannel,已获得客户端发送来的数据。
采用事件触发机制,处理程序可以得到系统的主动通知,从而可以得到底层网络IO无阻色的读写。不像以前循环等待。使用NIO,可以编写性能更好,更易扩展的并发性服务器程序。
设计原理(观察者模式)
有selector轮询各个Socketchannel通道是否有事件发生,有则选择出所有的key集合。然后传递给处理程序。通过每个key,就可以获取客户端的SocketChannel,从而进行通信。
如果Selector发现所以通道都没有事件发生,则进入睡眠状态,阻塞,等待客户端有事件发生。会自动唤醒wakeup选择器selector。
java NIO具有网络跨时代的意义,Mina就是采用nio机制。