1.为何须要NIO?java
Socket:当调用某个调用的时候,调用的地方就会阻塞,等待响应。这种方式对于小规模的程序很是方便,可是对于大型的程序就有点力不从心了,当有大量的链接的时候,咱们能够为每个链接创建一个线程来操做。可是这种作法带来的缺陷也是显而易见的:编程
硬件可以支持大量的并发。缓存
并发的数量始终有一个上限。网络
各个线程之间的优先级很差控制。并发
各个Client之间的交互与同步困难。性能
咱们也可使用一个线程来处理全部的请求,使用不阻塞的IO,轮询查询全部的Client。这种作法一样也有缺陷:没法迅速响应Client端,同时会消耗大量轮询查询的时间。线程
因此,咱们须要一种poll(轮询)的模式来处理这种状况,从大量的网络链接中找出来真正须要服务的Client。这正是NIO诞生的缘由:提供一种Poll的模式,在全部的Client中找到须要服务的Client。对象
NIO库中最最重要的Class:java.nio.channels中Selector和Channel,以及java.nio中的Buffer。同步
Channel表明一个能够被用于Poll操做的对象(能够是文件流也可使网络流),Channel可以被注册到一个Selector中。经过调用Selector的select方法能够从全部的Channel中找到须要服务的实例(Accept,read ..)。Buffer对象提供读写数据的缓存。相对于咱们熟悉的Stream对象,Buffer提供更好的性能以及更好的编程透明性(人为控制缓存的大小以及具体的操做)。io