阻塞与非阻塞和同步与异步以及它们之间的联系

阻塞与非阻塞:线程访问资源,该资源是否准备就绪的一种方式。如果说这个资源没有准备就绪,就会有的两种处理方式。

            阻塞:线程会持续等待这个资源处理完毕,直到它响应返回一个结果,这个线程不可以去做其他事情。

                                                                    图:

                                                                          阻塞与非阻塞和同步与异步以及它们之间的联系_第1张图片        

            非阻塞: 这个线程直接返回一个结果,它不会持续等待这个资源处理完毕在响应,它会去处理别的资源。   

                                                                      图:

                                                                          阻塞与非阻塞和同步与异步以及它们之间的联系_第2张图片

                                                                       

同步与异步:它是指访问数据的一种机制。

            同步:指主动请求,并且等待我们的IO操作完成之后,它会有一个通知。

                                                                     图:

                                                                           阻塞与非阻塞和同步与异步以及它们之间的联系_第3张图片

            异步:指在我们主动请求数据之后呢,继承去处理其他的任务,它可以去发起其他的请求,当我们有很多请求处理完毕之                         后,它在逐一通过一种异步的通知的方式来通知你。

                                                                     图:

                                                                           阻塞与非阻塞和同步与异步以及它们之间的联系_第4张图片

那么他们两两组合就可以出现:

                       BIO:同步阻塞的IO,又称Block IO,是一种非常传统,非常简单的模式,这个线程无法去做其他的操作,但是它                                   并发处理的能力会非常的低。

                                                                                               图:
                       阻塞与非阻塞和同步与异步以及它们之间的联系_第5张图片                                                    如图所示,如果在客户端的数量非常多时候,那么我们Server与Client之间,就会频繁的创建或频繁的销毁之间

                         的线程  ,那么我们的Server服务器就会有很大的压力,甚至会导致我们的服务器崩溃,所以说这种方式是非常                             来老的一种IO流的处理方式。

                      NIO:同步非租塞IO,New IO(Non-Block IO)

                                                                                              图:

           阻塞与非阻塞和同步与异步以及它们之间的联系_第6张图片                                      如图,在Client与Server端进行一个通信的时候,我们会使用到一个叫Selector的,可以认为它是一个选择器,它其实就是一个线程,它这个线程会主动的轮询,如果说我们的客户端和服务端要建立连接的时候,它就会进行一个注册,注册完成之后,我们就会有一个叫Channel的东西生成,那么每一个客户端和我们的Selector建立连接之后,都会有一个Channel生成,那么Channel它是一个通道,它是一个双向通道,它可以进行一些相应的数据的读写,那么这些数据的读写,都会到我们缓存区里面去,Channel是非阻塞的读取,Selector是一个单线程,它可以处理成千上万个客户端,客户端的增多,不会影响它的性能,也就是说Channel相当于一个读写的工具,每一个客户端都可以理解为一个单独的Channel, 或者说,每一个客户端和我们服务端建立连接之后,注册完毕之后,就会有一个单独的Channel,它是一个一对一的,每一个Client就会有一个单独的Channel与之对应,然后每一个服务端会有一个Selector,  缓存区里面的数据会用于读写,数据被用于读完之后,这个数据还会存在缓存区内的,它不会因为我们的数据被读取了会后就消失。

                                        AIO:  异步非阻塞

          最后简单的用生活实例总结下它们:

                                               图:

阻塞与非阻塞和同步与异步以及它们之间的联系_第7张图片      

                  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(java,java多线程)