非阻塞io:传统的读写会发生阻塞,server/client每个请求产生一个线程,导致线程数量增大
一般采用线程池模型,并且会限制线程池的大小。
非阻塞io采用reactor模式,io调用不会被阻塞,相反会注册感兴趣的特定io事件。(可读数据到达,新的连接建立)
发生特定事件,系统通知。
非阻塞io核心对象是selector,用来注册io事件并且通知事件发生。
当有事件发生时,从selector获取selectorkey。从selectorkey中找出事件和事件发生具体的selectableChannel。
获取客户端发送过来的数据。
二。使用nio编写服务器程序,步骤如下:
向selector对象注册感兴趣的事件,从selector获取感兴趣的事件,根据不同的事件进行相应的处理。
创建serverSocketChannel对象,调用configuringblocking方法,配置为非阻塞模式,向selector注册事件,从selector获取感兴趣的事件
内部循环模式:调用select方法,直到有一个事件发生,调用selectKey方法获取发生事件的selectionkey,在使用迭代器进行循环处理
三。java io和nio区别
阻塞io产生大量线程,带来频繁的上下文切换。
nio:有一个专门的线程处理io分发,事件驱动,事件到时触发不是同步监视。
java nio采用双向通道进行数据传输,而不是单向的流。