異步與非阻塞

異步和非阻塞調用之間有什麼區別? 阻塞和同步調用之間(請舉例)? 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樓

  • 異步是指並行完成的事情,好比另外一個線程。
  • 非阻塞一般是指輪詢 ,即檢查給定條件是否成立(套接字是否可讀,設備是否有更多數據等)
相關文章
相關標籤/搜索