async io(基於套接字)有什麼選擇在java中,然後是java.nio中?另外java.nio在後臺使用線程(正如我認爲.NET的異步套接字庫所做的那樣,可能它已被更改),還是使用正確的select調用,它是「真正的」異步io?Java中的異步IO?
回答
Java的NIO軟件包(自Java6起)僅通過Selector s提供對非阻塞I/O的支持。 Java7有望與NIO.2一起發佈,其中包括異步I/O支持。今天,你最好的選擇是利用框架。 ARMistice提到了Mina。這裏有一些其他的。
- Grizzly。這是Sun的GlassFish服務器的I/O核心。 Grizzly提供了一個用於執行異步讀/寫操作的工具(通過隊列模型)。它支持TCP和UDP。我在一些項目中使用了灰熊隊。有一些我喜歡和不喜歡的框架,但要詳細說明這是另一個話題。我會說,讓事情變得很容易,灰熊爲你做了很多繁重的工作。
- Netty。該項目來自Mina項目的原作者之一。我沒有使用過這個,所以我不知道它對異步I/O的支持。你應該看看。
現在,關於關於線程的問題,NIO選擇器不使用線程進行非阻塞I/O。在JDK6中,他們使用Windows下的select()以及更新Linux內核上的epoll工具。對於異步I/O,線程細節取決於框架。
java.nio
只是一個包 - 「啞」類的集合 - 它本身並沒有使用任何線程的使用。如果使用得當,例如在Reactor design pattern中,則可以實現正確的,可完全擴展的異步I/O。
你的答案似乎對我而言是合法的,但你能解釋更多嗎?請多一點解釋。 – 2017-01-05 15:28:44
關於庫的另一個建議是Naga(http://naga.googlecode.com)。它不像一個框架,更像一個圖書館。它試圖看起來更像普通的java套接字,如果那是你的一杯茶。與灰熊,米娜和內蒂相比,它極其簡約。
對於原始問題,在Unix/Linux系統上,實現僅在一種情況下每個I/O操作佔用一個線程,即AsynchronousFileChannel。
JAVA 7到了,所以新的答案是NIO.2和Future類。例如:
在服務器端:
final AsynchronousServerSocketChannel serverSocket=
AsynchronousServerSocketChannel.open().bind(new InetSocketAddress("127.0.0.1", 2587)); // Listening on port 2587 for client connection
Future<AsynchronousSocketChannel> future= serverSocket.accept();
final AsynchronousSocketChannel clientSocket= future.get(); // now it's blocking, useful: future.isDone() and .isCancelled()
//Do whatever you want ..
InputStream stream = Channels.newInputStream(clientSocket) (...)
在客戶端:
AsynchronousSocketChannel clientChannel = AsynchronousSocketChannel.open();
Future connected = localSocket.connect(ourServerSocketAddress);
// later: if(future.isDone())
connected.get();
//Send something
OutputStream os = Channels.newOutputStream(clientChannel);
os.write (...)
更新: 如果你可以使用角色模型,然後AKKA TCP IO甚至會更好。
- 1. Java異步套接字IO
- 2. 異步IO與CFReadStream
- 3. 使用CFWriteStream的異步IO
- 4. 跨進程的異步IO
- 5. 如何理解Windows中的異步io?
- 6. Scala中的異步IO(套接字)
- 7. ALSA - 管理異步IO
- 8. 異步node.js概念與IO
- 9. 在異步IO完成
- 10. 異步調用和異步io調用之間的差異.net
- 11. 在Spring CLI中使用Java進行異步IO處理如何?
- 12. 的Java IO捕獲異常
- 13. 靜態類中的IO異常 - java的
- 14. 好的F#異步IO樣本
- 15. C++的非線程異步IO簡介?
- 16. Java IO異常捕獲
- 17. Java文件IO異常
- 18. Java IO異常 - 流關閉
- 19. [R方式的Java IO選中IO異常錯誤
- 20. 如何在node.js中創建非IO操作同步與異步?
- 21. java中的異步處理
- 22. Java中的異步解析
- 23. java中的異步UI
- 24. 爲什麼異步IO首選
- 25. C#異步網絡IO和OutOfMemoryException
- 26. C#封裝io與任務,使異步
- 27. NodeJS如何處理異步文件IO?
- 28. WCF異步操作+ IO操作
- 29. 使用stdio.h異步緩衝io?
- 30. 異步文件IO線程安全嗎?
底層流支持它的地方。NET使用IO完成端口和一個ThreadPool線程來執行回調。 – 2009-02-26 20:31:54
喬恩,什麼時候底層流不支持它? – 2010-05-04 21:10:54
關於爲什麼不使用java.nio的任何具體原因?實際上,我正在嘗試在我的項目中實施一些異步I/O,並且我之前沒有使用過任何一個。因此想知道。謝謝。 – Bhushan 2011-06-23 17:31:49