异步与非阻塞

异步和非阻塞调用之间有什么区别? 阻塞和同步调用之间(请举例)? java


#1楼

将此问题放在Java 7中的NIO和NIO.2的上下文中,异步IO比非阻塞更先进一步。 使用java NIO非阻塞调用,能够经过调用AbstractSelectableChannel.configureBlocking(false)来设置全部通道(SocketChannel,ServerSocketChannel,FileChannel等AbstractSelectableChannel.configureBlocking(false) 。 可是,在这些IO调用返回以后,您可能仍须要控制检查,例如是否以及什么时候再次读/写等。
例如, api

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楼

阻止呼叫:控制仅在呼叫完成时返回。 异步

非阻塞调用:控制当即返回。 后来的操做系统以某种方式通知进程调用已完成。 socket


同步程序:使用阻塞调用的程序。 为了在调用期间不冻结它必须有2个或更多个线程(这就是为何它被称为同步 - 线程同步运行)。 async

异步程序:使用非阻塞调用的程序。 它只能有1个线程,仍然保持交互状态。 ide


#3楼

它们的拼写不一样。 他们提到的内容没有区别。 要说技术,你能够说他们的重点不一样。 非阻塞是指控制流(它不会阻塞。)异步是指处理事件\\数据时(不一样步)。 函数


#4楼

在许多状况下,它们是同一个东西的不一样名称,但在某些状况下它们是彻底不一样的。 因此这取决于。 术语不是以彻底一致的方式应用于整个软件行业。 spa

例如,在经典套接字API中,非阻塞套接字只是当即返回一个特殊的“会阻塞”错误消息,而阻塞套接字则会被阻塞。 您必须使用单独的函数(如selectpoll来肯定什么时候是重试的好时机。 操作系统

但异步套接字(由Windows套接字支持)或.NET中使用的异步IO模式更方便。 您调用一个方法来启动一个操做,框架会在完成后回调您。 即便在这里,也存在基本的差别。 异步Win32套接字经过传递Window消息将其结果“编组”到特定的GUI线程,而.NET异步IO是自由线程的(您不知道将调用哪一个线程回调)。

因此他们并不老是意味着一样的事情。 为了提炼插座示例,咱们能够说:

  • 阻塞和同步意味着一样的事情:你调用API,它挂起线程,直到它有某种答案并返回给你。
  • 非阻塞意味着若是没法快速返回答案,则API会当即返回错误而且不执行任何操做。 所以必须有一些相关的方法来查询API是否能够被调用(即,以有效的方式模拟等待,以免在紧密循环中手动轮询)。
  • 异步意味着API老是当即返回,已经开始“后台”努力来完成您的请求,所以必须有一些相关的方法来得到结果。

#5楼

  • 异步是指并行完成的事情,好比另外一个线程。
  • 非阻塞一般是指轮询 ,即检查给定条件是否成立(套接字是否可读,设备是否有更多数据等)
相关文章
相关标签/搜索