1:javaIO与NIO区别:IO是基于流的,而NIO是基于缓存的。JavaIO每次从流中读取一个或者多个字节,知道读取所有的字节,不能前后移动流中的数据。而NIO通过通道读取到缓存区中,需要可在缓存区中前后移动,
2:javaIO是阻塞的,而NIO是非阻塞的;IO阻塞当一个线程调用read()方法或者write()方法的时候,该线程会阻塞直到数据读取或者写完毕,中间线程不能干别的事情;而在NIO中,以个线程可以通过通道去向缓存中发送一个读取数据请求,当没有数据时就会去做别的事,而不会一直等待直到读取到数据为止(io就是如果read了没有读取到想要的就会一直等待,直到读取到),NIO向文件缓存器写数据也一样,他可以只向其中写一部分,而不是全部写完(在写的时候线程当然不能做别的事情了)。
3:选择器:NIO允许一个线程来监视多个输入通道,可以注册一个选择器,然后用一个单独的线程来管理选择监控那一个通道;
4:运用场景:如果需要管理同时打开的成千上万个连接,这些连接每次只是发送少量的数据,例如聊天服务器,实现NIO的服务器可能是一个优势。同样,如果你需要维持许多打开的连接到其他计算机上,如P2P网络中,使用一个单独的线程来管理你所有出站连接,可能是一个优势。
5:NIO的读流程:先向通道发出读取数据请求,然后通道向buffer中写入数据,如果buffer中满或者不满,你都可以向其中读取数据。
6:同步异步:同步和异步是消息通信机制:同步:发出一个请求,然后一定要等待其返回,在返回期间,如果该线程去干别的事情,那就是不阻塞了(由于是同步,操作系统并不会通知你消息准备好了,所以你要过一会就去询问一次);组合起来就叫同步非阻塞;如果在等待期间,当前线程一直在等待,而不干别的事情就是同步阻塞;
7:异步:发送一个请求,我(应用程序)就不用去管了,等待操作系统来完成以后通知我,如果在发送了请求以后,在操作系统没有通知我这段时间,线程什么都不干(所以异步阻塞基本上不实用),一直在哪儿等着,那么就是异步阻塞,如果在操作系统告诉应用程序之前,线程去干别的,也就是异步非阻塞;
8:同步阻塞的BIO、同步非阻塞的NIO(要去轮询,单独效率低比BIO稍低,但是在实际运用中效率就高了)、异步非阻塞的AIO;
11:NIO的最重要的地方是当一个连接创建后,不需要对应一个线程,这个连接会被注册到多路复用器上面,所以所有的连接只需要一个线程就可以搞定,当这个线程中的多路复用器进行轮询的时候,发现连接上有请求的话,才开启一个线程进行处理,也就是一个请求一个线程模式。(回答的核心,服务器中应用)
在NIO的处理方式中,当一个请求来的话,开启线程进行处理,可能会等待后端应用的资源(JDBC连接等),其实这个线程就被阻塞了,当并发上来的话,还是会有BIO一样的问题。
12:HTTP/1.1出现后,有了Http长连接,这样除了超时和指明特定关闭的http header外,这个链接是一直打开的状态的,这样在NIO处理中可以进一步的进化,在后端资源中可以实现资源池或者队列,当请求来的话,开启的线程把请求和请求数据传送给后端资源池或者队列里面就返回,并且在全局的地方保持住这个现场(哪个连接的哪个请求等),这样前面的线程还是可以去接受其他的请求,而后端的应用的处理只需要执行队列里面的就可以了,这样请求处理和后端应用是异步的.当后端处理完,到全局地方得到现场,产生响应,这个就实现了异步处理。(异步IO原理)