同步与异步:
同步:发起一个调用之后,被吊用着未处理完该请求之前,调用不返回。
异步:发起一个调用,被调用者立刻返回已接收到请求,但是被调用者并没有返回结果,此时我们可以处理其它请求,被调用者通常依靠时间、回调等机制来通知调用者其返回结果。
阻塞与非阻塞:
阻塞:阻塞就是发起一个请求,调用者一直等待请求结果的返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪才能继续。
非阻塞:发起一个请求,调用者不用等着结果的返回,可以先去干其他事情。
BIO
传统的java io编程,基本类与接口在io包中。
同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需启动一个线程进行处理,若这个连接不做任何事情会造成不必要的线程开销。
适用于连接数目较小并且固定的架构,这种服务方式对于服务器的资源要求要高,并且局限于应用中,java1.4前唯一选择。
模型
NIO
java1.4提供了io新特性,被称为NIO,是同步非阻塞的
NIO相关类都被放在java.nio包及其子包下
三大核心:Channel(通道),Buffer(缓冲区),Selector(选择器)
NIO是面向缓冲区或者面向块编程的。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区内前后移动,这就增加了处理过程中的灵活性,使用它可以提供非阻塞的高伸展性网络。
NIO通过零拷贝的buffer取得数据,每一个客户端通过channel在selector(多路复用器)上进行注册。服务端不断轮询channel来获取客户端的信息。channel上有connect,accept(阻塞)、read(可读)、write(可写)四种状态标识。根据标识来进行后续操作。所以一个服务端可接收无限多的channel。不需要新开一个线程。大大提升了性能。
NIO是可以做到用一个线程处理多个操作的。假设有1000个请求过来,根据实际情况,可以分配50或100个线程来处理。不想BIO一样需要分配1000个线程来处理
BIO和NIO的区别
NIO以流的方式处理数据,NIO以块的方式处理数据,块IO的效率比流IO高很多。
BIO是阻塞的,NIO是非阻塞的
BIO基于字节流和字符流进行操作的,而NIO基于Channel(通道)和Buffer(缓冲区)进行操作的,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择器)用于监听多个通道事件,因此使用单个线程就可以监听多个客户端通道