Java NIO提供了SocketChannel
和ServerSocketChannel
,它們可以設置爲非阻塞模式(異步)。大多數操作返回與成功對應的值或操作尚未完成。那麼除了回調函數之外,AynchronousSocketChannel
和AsynchronousServerSocketChannel
的目的是什麼?Java NIO - 非阻塞通道與異步通道
1
A
回答
3
可以設置爲非阻塞模式(異步)
有你的誤解,就在那裏。非阻塞模式是不同於異步模式的。
非阻塞操作要麼傳輸數據,要麼不傳輸數據。在任何一種情況下都沒有阻塞,並且一旦返回就完成操作。該模式由SocketChannel,
DatagramSocketChannel,
和Selector.
支持,當你調用該方法,並繼續在後臺,結果通過回調或Future
變得可用在稍後的時間異步操作開始。您在問題中提到的AsynchronousSocketChannel
等課程支持此模式。
1
當使用採用CompletionHandler的方法時,AynchronousSocketChannel和AsynchronousServerSocketChannel會自動生成。
例如,在服務器的代碼可能是這樣的:
asynchronousServerSocketChannel.accept(Void, new ConnectionHander());
哪裏ConnectionHander
是與客戶端連接的交易CompletionHandler的實現。
調用accept調用的線程可以繼續執行其他工作,並且在客戶端連接(我認爲這是OS級中斷)時,NIO API將處理將回調安排到CompletionHandler。
替代代碼可能是這樣的:
SocketChannel socketChannel = serverSocketChannel.accept();
根據不同的模式,調用線程現在阻塞,直到一個客戶端連接或返回null
更讓您調查。在這兩種情況下,你都必須處理線程,這通常意味着更多的工作。
在一天結束時,您會根據您的特定用例進行選擇,但我通常會先生成更清晰的更可靠的代碼。
相關問題
- 1. 關閉非阻塞套接字通道
- 2. NIO.2異步通道編碼準則
- 3. 異步與非阻塞
- 4. Java NIO非阻塞模式vs node.js異步操作
- 5. 阻塞通道vs異步消息傳遞
- 6. 處理來自高速通道的消息異步,非阻塞訂閱
- 7. NIO非阻塞模式
- 8. 通過Java編寫和讀取對象NIO非阻塞SocketChannels
- 9. 非阻塞命名管道
- 10. 如何java-nio是非阻塞混淆
- 11. shell/filesystem中的非阻塞/異步FIFO /命名管道?
- 12. 阻塞與同步,非阻塞和異步之間有什麼區別?
- 13. 如何正確關閉非阻塞套接字通道?
- 14. 從Java NIO通道解析StAX
- 15. C#異步套接字通信阻塞
- 16. JAVA - 非可寫通道異常
- 17. 異步關閉套接字通道
- 18. 應對流-NIO的通道與io
- 19. 非阻塞通道中的SO_TIMEOUT在netty中
- 20. go中的非阻塞通道操作。發送?
- 21. 非阻塞的Socket通過與fgets
- 22. 消息從RabbitMQ的信道傳遞到Java NIO通道
- 23. mpi:阻塞與非阻塞
- 24. 非阻塞管道中的I/O
- 25. 使用popen的非阻塞管道?
- 26. 記錄到非阻塞命名管道?
- 27. 管道上的非阻塞讀取
- 28. 在PHP中非阻塞打開管道
- 29. C++非阻塞異步計時器
- 30. 異步/非阻塞查詢中的SQLDeveloper