Java:什么叫做同步非阻塞IO呢?

同步表示我这个发出请求的线程还在等待消息返回,但是由于是非阻塞的,所以这个线程不会被挂机,还可以执行其他的操作,但是我奇怪的是,刚才那个操作的结果都没返回呢,如何执行这个... 同步表示我这个发出请求的线程还在等待消息返回,但是由于是非阻塞的,所以这个线程不会被挂机,还可以执行其他的操作,但是我奇怪的是,刚才那个操作的结果都没返回呢,如何执行这个所谓“其他的操作“呢? 展开
 我来答
婉顺还柔润的画眉鸟h
推荐于2017-10-11 · 超过36用户采纳过TA的回答
知道小有建树答主
回答量:57
采纳率:0%
帮助的人:63.7万
展开全部
这个IO不用等待对方返回结果,打开IO指令执行完成后,会继续执行指令后面的操作,当对方返回数据后会出发一个事件,告诉你数据回来了,例如使用selector的非阻塞IO.你应当看看java.nio.
优就业郭老师
推荐于2018-06-26 · TA获得超过961个赞
知道小有建树答主
回答量:1053
采纳率:90%
帮助的人:388万
展开全部
这个IO不用等待对方返回结果,
打开IO指令执行完成后,
会继续执行指令后面的操作,
当对方返回数据后会出发一个事件,
告诉你数据回来了,
例如使用selector的非阻塞IO.你应当看看java.nio.
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Davidze
2018-06-25 · TA获得超过135个赞
知道答主
回答量:5
采纳率:100%
帮助的人:2.2万
展开全部

首先这个不是JAVA特有的概念。

同步非阻塞:同步指的是调用者程序需要等待被调用逻辑执行完毕才可以继续向下执行,阻塞指的是被调用程序逻辑不能立即返回,需要调用程序等待。“非阻塞”体现在I/O函数立即返回给调用者一个结果而不论I/O中是否含有数据。主程序需要根据每次调用I/O函数返回的值判断数据是否已经准备OK,如果可以被处理了才继续往下进行处理。(因此“其它的操作”,可以是不断轮询调用的IO函数,也可以做其它任何事情(比如我判断当前没有数据,就不处理数据了,随便干个别的事情完事- -!))

楼主之所以有疑问,是因为楼主的案例看起来都得等待IO完成才可以继续处理吧,看起来都是“阻塞”了主程序的数据处理逻辑(没有数据后续还做什么处理是吧),但事实是你可以不处理数据,做其它任何事情,因此上述IO并没有阻塞你的程序执行(IO函数没有阻塞调用者程序),只是在数据处理的逻辑上阻塞了(逻辑阻塞)。

总:楼主这个所谓“其他的操作“呢?在逻辑处理上应该是写一个轮训判断IO的数据是否OK,每一次轮训相对于是做了一个"其它操作",因为上一个时刻的函数调用并没有阻塞后一个时刻的函数调用。(注意理解“逻辑阻塞” 与 “程序阻塞”)

备注:

  1. 推荐阅读unix BIO, NIO, AIO 这是三个是本质,java Netty即其中的I/O多路复用模型实现;(B: Block 阻塞的含义, N:Non-Block, A: Async)

  2. 之所以有这么多复杂的模型,实际上都是为了节省计算机的资源,按细了说比如CPU,比如内存。其它角度看,线程也是一种比较奢侈的资源。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2017-10-10
展开全部
假设你等待消息的线程是a,那么在a中再启动个子线程a1,把等待消息这个操作扔给a1去,你在a中就使用while(true){}这样一个循环,反复去调用a1的一个方法来获取消息返回结果,比如,你可以定义个消息存储变量Object result = null;(也可以不为null,反正你可以设定一个值,这个值肯定不会出现在返回消息中的,后续判断操作有用)你把接收到的消息赋值给result,然后你再提供个getResult方法,获取Result值,因为你还没收到消息,就会堵塞在接收那句代码,那么赋值操作也不会执行咯,因此,result还是null,那么你在a线程中获取到的Result也是null,通过这个值,你就可以判断出消息是否返回同时又可以在a线程中根据实际情况去做后续的操作。以上大概是我的理解了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式