异步和非阻塞调用之间有什么区别? 阻塞和同步调用之间(请举例)?
#1楼
将此问题放在Java 7中的NIO和NIO.2的上下文中,异步IO比非阻塞更先进一步。 使用java NIO非阻塞调用,可以通过调用AbstractSelectableChannel.configureBlocking(false)来设置所有通道(SocketChannel,ServerSocketChannel,FileChannel等AbstractSelectableChannel.configureBlocking(false) 。 但是,在这些IO调用返回之后,您可能仍需要控制检查,例如是否以及何时再次读/写等。
例如,
while (!isDataEnough()) {
socketchannel.read(inputBuffer);
// do something else and then read again
}
使用java 7中的异步api,可以以更通用的方式创建这些控件。 两种方法之一是使用CompletionHandler 。 请注意,两个read调用都是非阻塞的。
asyncsocket.read(inputBuffer, 60, TimeUnit.SECONDS /* 60 secs for timeout */,
new CompletionHandler<Integer, Object>() {
public void completed(Integer result, Object attachment) {...}
public void failed(Throwable e, Object attachment) {...}
}
}
#2楼
阻止呼叫:控制仅在呼叫完成时返回。
非阻塞调用:控制立即返回。 后来的操作系统以某种方式通知进程调用已完成。
同步程序:使用阻塞调用的程序。 为了在调用期间不冻结它必须有2个或更多个线程(这就是为什么它被称为同步 - 线程同步运行)。
异步程序:使用非阻塞调用的程序。 它只能有1个线程,仍然保持交互状态。
#3楼
它们的拼写不同。 他们提到的内容没有区别。 要说技术,你可以说他们的重点不同。 非阻塞是指控制流(它不会阻塞。)异步是指处理事件\\数据时(不同步)。
#4楼
在许多情况下,它们是同一个东西的不同名称,但在某些情况下它们是完全不同的。 所以这取决于。 术语不是以完全一致的方式应用于整个软件行业。
例如,在经典套接字API中,非阻塞套接字只是立即返回一个特殊的“会阻塞”错误消息,而阻塞套接字则会被阻塞。 您必须使用单独的函数(如select或poll来确定何时是重试的好时机。
但异步套接字(由Windows套接字支持)或.NET中使用的异步IO模式更方便。 您调用一个方法来启动一个操作,框架会在完成后回调您。 即使在这里,也存在基本的差异。 异步Win32套接字通过传递Window消息将其结果“编组”到特定的GUI线程,而.NET异步IO是自由线程的(您不知道将调用哪个线程回调)。
所以他们并不总是意味着同样的事情。 为了提炼插座示例,我们可以说:
- 阻塞和同步意味着同样的事情:你调用API,它挂起线程,直到它有某种答案并返回给你。
- 非阻塞意味着如果无法快速返回答案,则API会立即返回错误并且不执行任何操作。 因此必须有一些相关的方法来查询API是否可以被调用(即,以有效的方式模拟等待,以避免在紧密循环中手动轮询)。
- 异步意味着API总是立即返回,已经开始“后台”努力来完成您的请求,因此必须有一些相关的方法来获得结果。
#5楼
- 异步是指并行完成的事情,比如另一个线程。
- 非阻塞通常是指轮询 ,即检查给定条件是否成立(套接字是否可读,设备是否有更多数据等)
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3182873