NIO BIO AIO 的区别?告别与分别的区别适合在什么情况下使用

BIO, NIO, AIO的阻塞非阻塞、同步异步体现在哪里? - ITeye问答
传统的BIO socket读写过程如下,其中等待连接和读写操作是阻塞的。那么NIO到底是哪里不阻塞了呢?我看林昊的书上说是“发起IO的读或写操作时,是不阻塞的”。但我不太理解这句话的意思。是指等待连接的动作是非阻塞的吗?那Selector.select()还是阻塞的啊。网上也有很多文章说是真正的读写操作是非阻塞的。这我就更糊涂了。
还有,AIO的异步到底体现在哪里呢?就是指内核线程在做读写操作,完成之后把结果返回给业务线程?就是指业务线程不用等待吗?那NIO里的业务线程不是也不用等待吗?
我思维很混乱,希望有人能给指明一下。谢谢
http://my.oschina.net/shawnChen/blog/11508
/blog/195548
资料很多的
本质上来说,同步异步、阻塞非阻塞不是同一种概念,同步和异步是消息的通知机制的概念,阻塞非阻塞是指进程的状态
/converse/archive//82879.html
已解决问题
未解决问题2711人阅读
& & & &&是一个提供异步事件驱动的网络应用框架,用以快速开发高性能、高可靠性的网络服务器和客户端程序。换句话说,Netty是一个NIO框架,使用它可以简单快速地开发网络应用程序,比如客户端和服务端的协议。这是官方文档中的描述,作为Java初学者,这里面一个名词NIO是完全没有概念,为此专门查阅了相关资料,对NIO有了较为清晰的了解。
& & & & 对于NIO的描述,通常都是和BIO、AIO进行对比说明的。下面将分别说明三者的概念。
& & & & BIO:&同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理(一客户端一线程)。该模型最大的问题就是缺乏弹性伸缩能力,当客户端并发访问量增加后,服务端的线程数与客户端并发访问数呈1:1的关系,系统性能将急剧下降,随着并发访问量的继续增加,系统会发生线程堆栈溢出、创建新线程失败等问题,并最终导致宕机或僵死。
& & & & NIO:异步非阻塞,服务器实现模式为一个请求一个线程,客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
对于NIO,有两点需要强调的:
& & & (1)关于概念有两种理解,New I/O(相对于之前的I/O库是新增的)和Non-block I/O(非阻塞的)。由于NIO的目标就是让java支持非阻塞I/O,所有更多人喜欢用Non-block I/O。
& & & (2)很多人喜欢将NIO称为异步非阻塞I/O,但是,如果按照严格的NUIX网络编程模型和JDK的实现进行区分,实际上它只是非阻塞I/O,不能称之为异步非阻塞I/O。但由于NIO库支持非阻塞读和写,相对于之前的同步阻塞读和写,它是异步的,因此很多人习惯称NIO为异步非阻塞I/O。
& & & &AIO:JDK1.7升级了NIO库,升级后的NIO库被称为NIO2.0,正式引入了异步通道的概念。NIO2.0的异步套接字通道是真正的异步非阻塞I/O,此即AIO。其服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5475次
排名:千里之外
(1)(4)(4)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'2822人阅读
在高性能的IO体系设计中,有几个名词概念常常会使我们感到迷惑不解。具体如下:&
什么是同步?
什么是异步?
什么是阻塞?
什么是非阻塞?
什么是同步阻塞?
什么是同步非阻塞?
什么是异步阻塞?
什么是异步非阻塞?
散仙不才,在查了一部分资料后,愿试着以通俗易懂的方式解释下这几个名词。如有不足之处,还望告知。&
在弄清楚上面的几个问题之前,我们首先得明白什么是同步,异步,阻塞,非阻塞,只有这几个单个概念理解清楚了,然后在组合理解起来,就相对比较容易了。&
1,同步和异步是针对应用程序和内核的交互而言的。&同步/异步是在时间上强调处理事情的结果/机会成本的两种处理策略;强调结果意味着对结果的迫不急待,不过结果是正确的还是错误的,反正你要立即给我一个结果响应;强调时间机会成本意味着对等待结果浪费的时间极其难接受,而对结果并不是那么急切,暂时不管结果(让处理方处理完主动通知结果/自己空闲的时候主动去获取结果)转而去处理其他事情
2,阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。
3,同步/异步是宏观上(进程间通讯,通常表现为网络IO的处理上),阻塞/非阻塞是微观上(进程内数据传输,通常表现为对本地IO的处理上);阻塞和非阻塞是同步/异步的表现形式
由上描述基本可以总结一句简短的话,同步和异步是目的,阻塞和非阻塞是实现方式。&
指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪
自己上街买衣服,自己亲自干这件事,别的事干不了。
异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知(异步的特点就是通知)
告诉朋友自己合适衣服的尺寸,大小,颜色,让朋友委托去卖,然后自己可以去干别的事。(使用异步IO时,Java将IO读写委托给OS处理,需要将数据缓冲区地址和大小传给OS)
所谓阻塞方式的意思是指, 当试图对该文件描述符进行读写时, 如果当时没有东西可读,或者暂时不可写, 程序就进入等待 状态, 直到有东西可读或者可写为止
去公交站充值,发现这个时候,充值员不在(可能上厕所去了),然后我们就在这里等待,一直等到充值员回来为止。(当然现实社会,可不是这样,但是在计算机里确实如此。)
非阻塞状态下, 如果没有东西可读, 或者不可写, 读写函数马上返回, 而不会等待,
银行里取款办业务时,领取一张小票,领取完后我们自己可以玩玩手机,或者与别人聊聊天,当轮我们时,银行的喇叭会通知,这时候我们就可以去了。
下面我们再来理解组合方式的IO类型,就好理解多了。&
同步阻塞IO(JAVA BIO):&
&&& 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。&
同步非阻塞IO(Java NIO) : 同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。用户进程也需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问。&
异步阻塞IO(Java NIO):&&
&& 此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序,这其实就是同步和异步最关键的区别,同步必须等待或者主动的去询问IO是否完成,那么为什么说是阻塞的呢?因为此时是通过select系统调用来完成的,而select函数本身的实现方式是阻塞的,而采用select函数有个好处就是它可以同时监听多个文件句柄(如果从UNP的角度看,select属于同步操作。因为select之后,进程还需要读写数据),从而提高系统的并发性!&&
(Java AIO(NIO.2))异步非阻塞IO:&&
&& 在此种模式下,用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。&&&&
BIO、NIO、AIO适用场景分析:&
&&& BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。&
&&& NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。&
&&& AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。&
搞清楚了以上概念以后,我们再回过头来看看,Reactor模式和Proactor模式。&&
(其实阻塞与非阻塞都可以理解为同步范畴下才有的概念,对于异步,就不会再去分阻塞非阻塞。对于用户进程,接到异步通知后,就直接操作进程用户态空间里的数据好了。)&&
首先来看看Reactor模式,Reactor模式应用于同步I/O的场景。我们分别以读操作和写操作为例来看看Reactor中的具体步骤:&&
读取操作:&&
1. 应用程序注册读就绪事件和相关联的事件处理器&&
2. 事件分离器等待事件的发生&&
3. 当发生读就绪事件的时候,事件分离器调用第一步注册的事件处理器&&
4. 事件处理器首先执行实际的读取操作,然后根据读取到的内容进行进一步的处理&&
写入操作类似于读取操作,只不过第一步注册的是写就绪事件。&&
下面我们来看看Proactor模式中读取操作和写入操作的过程:&&
读取操作:&&
1. 应用程序初始化一个异步读取操作,然后注册相应的事件处理器,此时事件处理器不关注读取就绪事件,而是关注读取完成事件,这是区别于Reactor的关键。&&
2. 事件分离器等待读取操作完成事件&&
3. 在事件分离器等待读取操作完成的时候,操作系统调用内核线程完成读取操作(异步IO都是操作系统负责将数据读写到应用传递进来的缓冲区供应用程序操作,操作系统扮演了重要角色),并将读取的内容放入用户传递过来的缓存区中。这也是区别于Reactor的一点,Proactor中,应用程序需要传递缓存区。&&
4. 事件分离器捕获到读取完成事件后,激活应用程序注册的事件处理器,事件处理器直接从缓存区读取数据,而不需要进行实际的读取操作。&&
Proactor中写入操作和读取操作,只不过感兴趣的事件是写入完成事件。&&
从上面可以看出,Reactor和Proactor模式的主要区别就是真正的读取和写入操作是有谁来完成的,Reactor中需要应用程序自己读取或者写入数据,而Proactor模式中,应用程序不需要进行实际的读写过程,它只需要从缓存区读取或者写入即可,操作系统会读取缓存区或者写入缓存区到真正的IO设备.&&
&&&&&&&&& 综上所述,同步和异步是相对于应用和内核的交互方式而言的,同步 需要主动去询问,而异步的时候内核在IO事件发生的时候通知应用程序,而阻塞和非阻塞仅仅是系统在调用系统调用的时候函数的实现方式而已。&&
如果你想吃一份宫保鸡丁盖饭:&
同步阻塞:你到饭馆点餐,然后在那等着,还要一边喊:好了没啊!&
同步非阻塞:在饭馆点完餐,就去遛狗了。不过溜一会儿,就回饭馆喊一声:好了没啊!&
异步阻塞:遛狗的时候,接到饭馆电话,说饭做好了,让您亲自去拿。&
异步非阻塞:饭馆打电话说,我们知道您的位置,一会给你送过来,安心遛狗就可以了。&
“一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作。&
同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO。&
阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。&
同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到IO完成的通知。而阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,说白了是一种读取或者写入操作函数的实现方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。&
所以,IO操作可以分为3类:同步阻塞(即早期的IO操作)、同步非阻塞(NIO)、异步(AIO)。&
同步阻塞:&
在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式。&
同步非阻塞:&
在此种方式下,用户进程发起一个IO操作以后边可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。&
此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序。”&
这段话比较清楚&
关于BIO | NIO | AIO的讨论一直存在,有时候也很容易让人混淆,就我的理解,给出一个解释:
BIO | NIO | AIO,本身的描述都是在语言的基础上的。而描述IO,我们需要从两个层面:
编程语言实现原理底层基础
从编程语言层面
BIO | NIO | AIO 以Java的角度,理解,linux c里也有AIO的概念(库),这些概念不知道什么原因被炒火起来,这里只从Java角度入手。
BIO,同步阻塞式IO,简单理解:一个连接一个线程NIO,同步非阻塞IO,简单理解:一个请求一个线程AIO,异步非阻塞IO,简单理解:一个有效请求一个线程
在JDK1.4之前,用Java编写网络请求,都是建立一个ServerSocket,然后,客户端建立Socket时就会询问是否有线程可以处理,如果没有,要么等待,要么被拒绝。即:一个连接,要求Server对应一个处理线程。
在Java里的由来,在JDK1.4及以后版本中提供了一套API来专门操作非阻塞I/O,我们可以在java.nio包及其子包中找到相关的类和接口。由于这套API是JDK新提供的I/O API,因此,也叫New I/O,这就是包名nio的由来。这套API由三个主要的部分组成:缓冲区(Buffers)、通道(Channels)和非阻塞I/O的核心类组成。在理解NIO的时候,需要区分,说的是New I/O还是非阻塞IO,New I/O是Java的包,NIO是非阻塞IO概念。这里讲的是后面一种。
NIO本身是基于事件驱动思想来完成的,其主要想解决的是BIO的大并发问题: 在使用同步I/O的网络应用中,如果要同时处理多个客户端请求,或是在客户端要同时和多个服务器进行通讯,就必须使用多线程来处理。也就是说,将每一个客户端请求分配给一个线程来单独处理。这样做虽然可以达到我们的要求,但同时又会带来另外一个问题。由于每创建一个线程,就要为这个线程分配一定的内存空间(也叫工作存储器),而且操作系统本身也对线程的总数有一定的限制。如果客户端的请求过多,服务端程序可能会因为不堪重负而拒绝客户端的请求,甚至服务器可能会因此而瘫痪。
NIO基于Reactor,当socket有流可读或可写入socket时,操作系统会相应的通知引用程序进行处理,应用再将流读取到缓冲区或写入操作系统。&
也就是说,这个时候,已经不是一个连接就要对应一个处理线程了,而是有效的请求,对应一个线程,当连接没有数据时,是没有工作线程来处理的。
与NIO不同,当进行读写操作时,只须直接调用API的read或write方法即可。这两种方法均为异步的,对于读操作而言,当有流可读取时,操作系统会将可读的流传入read方法的缓冲区,并通知应用程序;对于写操作而言,当操作系统将write方法传递的流写入完毕时,操作系统主动通知应用程序。&
即可以理解为,read/write方法都是异步的,完成后会主动调用回调函数。&
在JDK1.7中,这部分内容被称作NIO.2,主要在java.nio.channels包下增加了下面四个异步通道:
AsynchronousSocketChannelAsynchronousServerSocketChannelAsynchronousFileChannelAsynchronousDatagramChannel
其中的read/write方法,会返回一个带回调函数的对象,当执行完读取/写入操作后,直接调用回调函数。
说道实现原理,还要从操作系统的IO模型上了解
按照《Unix网络编程》的划分,IO模型可以分为:阻塞IO、非阻塞IO、IO复用、信号驱动IO和异步IO,按照POSIX标准来划分只分为两类:同步IO和异步IO。如何区分呢?首先一个IO操作其实分成了两个步骤:发起IO请求和实际的IO操作,同步IO和异步IO的区别就在于第二个步骤是否阻塞,如果实际的IO读写阻塞请求进程,那么就是同步IO,因此阻塞IO、非阻塞IO、IO复用、信号驱动IO都是同步IO,如果不阻塞,而是操作系统帮你做完IO操作再将结果返回给你,那么就是异步IO。阻塞IO和非阻塞IO的区别在于第一步,发起IO请求是否会被阻塞,如果阻塞直到完成那么就是传统的阻塞IO,如果不阻塞,那么就是非阻塞IO。
收到操作系统的IO模型,又不得不提select/poll/epoll/iocp,关于这四个的理解,不多做解释,自己还没理解到位。
可以理解的说明是:在Linux 2.6以后,java NIO的实现,是通过epoll来实现的,这点可以通过jdk的源代码发现。而AIO,在windows上是通过IOCP实现的,在linux上还是通过epoll来实现的。
这里强调一点:AIO,这是I/O处理模式,而epoll等都是实现AIO的一种编程模型;换句话说,AIO是一种接口标准,各家操作系统可以实现也可以不实现。在不同操作系统上在高并发情况下最好都采用操作系统推荐的方式。Linux上还没有真正实现网络方式的AIO。
说到底层,要说Linux系统编程,这里自己也不熟悉,有待后来人补充了。&
只笼统的说一个:AIO实现
在windows上,AIO的实现是通过IOCP来完成的,看JDK的源代码,可以发现
WindowsAsynchronousSocketChannelImpl
看实现接口:
implements Iocp.OverlappedChannel
再看实现方法:里面的read0/write0方法是native方法,调用的jvm底层实现,虚拟机技术不熟悉,不献丑了。
在linux上,AIO的实现是通过epoll来完成的,看JDK源码,可以发现,实现源码是:
UnixAsynchronousSocketChannelImpl
看实现接口:
implements Port.PollableChannel
这是与windows最大的区别,poll的实现,在linux2.6后,默认使用epoll。
这样就可以理解了。
写在最后:Java开发为基础的,对于操作系统底层的认知是没有C语言为基础的大牛好的,语言决定了思维方式,古人诚不欺我
最后,几篇解释的不错的文章:
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:70600次
积分:2690
积分:2690
排名:第14046名
原创:171篇
转载:122篇
(2)(1)(2)(4)(42)(107)(49)(20)(6)(59)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&异步和非阻塞一样吗? (内容涉及BIO,NIO,AIO,Netty) - 一学就明的博客 - CSDN博客
异步和非阻塞一样吗? (内容涉及BIO,NIO,AIO,Netty)
网络编程/Netty
写在开头:
本文不是纯讲技术,会涉及概念理解和语义分析的要点。正如博主标题说的,高效的学习方法比拥有多少知识重要。高效的学习方法途径之一就是阅读理解,理解能力越好,掌握越快,知识体系更清晰。
如果刚入门Netty,看过Netty线程模型,又看过JDK的NIO、NIO2,是否困惑于NIO,AIO,阻塞非阻塞的理解?
Netty目前4.0的版本应该是“非阻塞”的“同步IO”(按照Unix IO模型定义)。之前曾经有版本支持“异步IO”(按照Unix IO模型定义),但是因为某些原因被后来版本移除了。不管Netty是“同步IO”还是“异步IO”(按照Unix IO模型定义),其实我们应用的层面是不需要区分的,因为这是框架底层封装处理。我们应该仅仅关心是我的业务客户端代码调用Netty的API时候客户端程序是否会停顿等待。
“不停顿等待”
广义的异步,非阻塞,都可以直接理解为正在执行的线程“不停顿等待”.
当下面业务端main线程执行callNettyApi()时候,不管callNettyApi()执行是否完成,线程继续运行至callBusinessHandle(),通俗说就是该main方法的线程在执行callBusinessHandle()之前没有停顿等待callNettyApi()执行结果。
业务端程序:
void main(){
callNettyApi(); // 异步?非阻塞?
callBusinessHandle();
void callNettyApi(){
...//运行很长时间,例如IO操作
基于上述的语境,用”不停顿等待”的词不够专业,于是很多人专业术语叫”异步”。然后叫”非阻塞”如何呢?其实也对啊,就是在执行callNettyApi()方法时候没有阻塞main线程。
至此,作为普通应用开发者调用Netty的API,无非就是关心自己调用的API方法是否让自己的主线程停顿等待API执行结果,这种场景下是其实不需要考虑异步和非阻塞的区别的,叫异步也好,叫非阻塞也好。也就是广义的异步和非阻塞等同于”不停顿等待”。
“停顿等待”
广义的同步,阻塞,都可以直接理解为正在执行的线程“停顿等待”.
这个不详细举例说明了,就是上面例子的相反理解就行。
文章开始就说了截止到Netty4.0版本是“非阻塞”的“同步IO”(按照Unix IO模型定义),同步与非阻塞矛盾?
答案是不矛盾。因为这句话要结合具体语境理解。
首先,在Unix的IO模型里:
异步I/O 是指用户程序发起IO请求后,不等待数据,同时操作系统内核负责I/O操作把数据从内核拷贝到用户程序的缓冲区后通知应用程序。数据拷贝是由操作系统内核完成,用户程序从一开始就没有等待数据,发起请求后不参与任何IO操作,等内核通知完成。
同步I/O 就是非异步IO的情况,也就是用户程序要参与把数据拷贝到程序缓冲区(例如java的InputStream读字节流过程)。
同步IO里的非阻塞 是指用户程序发起IO操作请求后不等待数据,而是调用会立即返回一个标志信息告知条件不满足,数据未准备好,从而用户请求程序继续执行其它任务。执行完其它任务,用户程序会主动轮询查看IO操作条件是否满足,如果满足,则用户程序亲自参与拷贝数据动作。
简单说,Unix IO模型的语境下,同步和异步的区别在于数据拷贝阶段是否需要完全由操作系统处理。阻塞和非阻塞操作是针对发起IO请求操作后是否有立刻返回一个标志信息而不让请求线程等待。基于这个语境,Netty目前的版本是没有把IO操作交过操作系统处理的,所以是属于同步的。对于网上大部分文章,如果别人说Netty是异步非阻塞,如果要深究,那真要看看Netty新的版本是否把IO操作交过操作系统处理,或者看看有否使用JDK1.7中的AIO API,否则他们说的异步其实是指客户端程序调用Netty的IO操作API“不停顿等待”。
其次,在Java的IO模型里:
JDK的各个历史版本引入如下概念。
BIO: Blocking IO
NIO:Non Blocking IO 或者 New IO
AIO:Asynchronous IO 或者 NIO2
这里的AIO应该就对应着Unix模型里的异步IO,也就是IO操作交给操作系统处理,充分调用OS参与并发操作,确实是操作系统的异步IO机制。
而BIO和NIO简单对比就是,NIO解决了BIO的痛点,把BIO中请求IO过程中的两步(请求连接+连接有真实IO请求时候的处理过程)分离开来,不让一个线程负责这两步。NIO就是一个线程负责所有请求连接但不处理IO操作,该线程只负责把连接注册到多路复用器上,多用复用器轮询到连接有IO请求时候再启动其它线程处理IO请求操作。
注意一点,Netty线程模型提及很多IO线程池,每条IO线程在进行IO操作(IO条件满足进行真正读写数据)时候虽然也是要消耗操作时间,但这种情况是否应该叫阻塞,取决于该IO线程有没有阻塞业务请求线程,当且仅当所有的IO线程在重度负载情形下(IO线程池所有IO线程在工作)导致业务请求线程提交不了新请求的情形下才叫IO线程的IO操作阻塞了业务线程的IO请求。由此可知,NIO也会产生BIO的情况。
平时项目里,沟通效率低效,往往也是不同的人描述不同的东西时候用了相同的词汇,或者相同的东西却用了不同的词汇,这都会造成双方理解困难。要高效沟通,其中途径之一就是统一概念叫法。不允许重要而难懂的概念被随意指代。
延伸, 那么你是否好奇程序如何实现非阻塞的?
建议看看Java的Future模式实现和JDK并发包里的Future工具库。IO操作不阻塞用户请求线程,编程可以使用Future模式实现。
希望本文帮你理解清楚这些概念,然后随心应用Netty或者进行网络编程,无所顾虑自己的困惑影响到程序编写的正确性。
参考文章:
我的热门文章

我要回帖

更多关于 圆脸适合的发型图片 的文章

 

随机推荐