2014-03-04 62 views
1

Java NIO提供了SocketChannelServerSocketChannel,它們可以設置爲非阻塞模式(異步)。大多數操作返回與成功對應的值或操作尚未完成。那麼除了回調函數之外,AynchronousSocketChannelAsynchronousServerSocketChannel的目的是什麼?Java NIO - 非阻塞通道與異步通道

回答

3

可以設置爲非阻塞模式(異步)

有你的誤解,就在那裏。非阻塞模式是不同於異步模式的

非阻塞操作要麼傳輸數據,要麼不傳輸數據。在任何一種情況下都沒有阻塞,並且一旦返回就完成操作。該模式由SocketChannel,DatagramSocketChannel,Selector.

支持,當你調用該方法,並繼續在後臺,結果通過回調或Future變得可用在稍後的時間異步操作開始。您在問題中提到的AsynchronousSocketChannel等課程支持此模式。

1

當使用採用CompletionHandler的方法時,AynchronousSocketChannelAsynchronousServerSocketChannel會自動生成。

例如,在服務器的代碼可能是這樣的:

asynchronousServerSocketChannel.accept(Void, new ConnectionHander()); 

哪裏ConnectionHander是與客戶端連接的交易CompletionHandler的實現。

調用accept調用的線程可以繼續執行其他工作,並且在客戶端連接(我認爲這是OS級中斷)時,NIO API將處理將回調安排到CompletionHandler

替代代碼可能是這樣的:

SocketChannel socketChannel = serverSocketChannel.accept(); 

根據不同的模式,調用線程現在阻塞,直到一個客戶端連接或返回null更讓您調查。在這兩種情況下,你都必須處理線程,這通常意味着更多的工作。

在一天結束時,您會根據您的特定用例進行選擇,但我通常會先生成更清晰的更可靠的代碼。