一.同步、异步、阻塞、非阻塞
1.同步:调用者发送一个请求,调用者需要等待返回结果才可以发送下一个请求。就是线程自己去获取结果(一个线程)
2.异步:调用者不需要等待返回结果即可发送请求。就是线程自己不去获取结果,而是由其它线程送结果(至少两个线程)
3.阻塞:调用者在等待返回结果之前,不能做其他事情,处于线程挂起状态
4.非阻塞:调用者在等待返回结果之前,可以去干其他事情
区别:同步和异步仅仅是关注的消息如何通知的机制,一般通过状态、通知和回调来通知调用者。而阻塞与非阻塞关注的是等待消息通知时的状态。
二.BIO
BIO同步阻塞:客户揣发送请求给服务揣,服务端没有响应前,客户端会一直等待服务端的响应,客户端也不能做其他任何事。
服务端会为每个客户端创建一个线程,用于管理该客户端,该线程会一直等客户端发送请求。
三.NIO
NIO同步非阻塞:客户端发送请求给服务端,服务端没有响应前,客户端会一直等待响应,但是客户端可以处理其他的任务。基于反应器模式,有个回调函数注册信息,当有io操作会触发,进行阻塞的io操作。
1.客户端与selector建立连接
2.selector会为该客户端创建一个Channel进行数据读写
3.selector多路复用器会不断轮询注册的Channel,如果某个Channel发生了读写事件,selector会通过SelectionKey将Channel获取出来
4.selector会创建一个工作线程处理事件,处理完销毁
优化:
1.用Cached线程池给出一个工作线程处理事件
2.使用buffer,工作线程将channel的数据写到buffer去,然后工作线程从buffer中去读取。工作线程将数据写入到buffer中,让channel去buffer读。
客户端从Channel中读数据是同步的
四.异步阻塞
异步阻塞(没这产品):客户揣发送请求给服务端,服务端处理任务需要很久,客户端不会等待服务器响应,客户端可以做其他的任务,如果服务器处理完毕把结果响应给客户端,客户端得到回调通知后处理服务端的响应,回调期间不能执行其他任务。类似于ajax异步请求。
五.AIO
AIO异步非阻塞:AIO 用来解决数据复制阶段的阻塞问题,意味着,在进行读写操作时,线程不必等待结果,而是将来由操作系统来通过回调方式由另外的线程来获得结果
AIO基于Proactor模型:
1.每个链接发送过来的请求,都会绑定一个buffer,然后通知操作系统去异步完成读,此时你的程序可以去干别的事情,等待操作系统完成数据读取操作后,会回调你的接口,给你的操作系统异步读完的数据。
2.然后你对这个数据处理一下,接着将结果往回写。
3.工作线程写的时候,你给操作系统一个有数据的buffer,让操作系统自己获取数据去完成写操作。写完后通知你,你的数据写回客户端去了。
4.工作线程读数据的时候,你提供一个空的buffer给操作系统,然后你可以去干别的事情。操作系统将读好的数据放入buffer中后,回调你的接口,将buffer交给你。