2009-02-26 101 views
56

async io(基於套接字)有什麼選擇在java中,然後是java.nio中?另外java.nio在後臺使用線程(正如我認爲.NET的異步套接字庫所做的那樣,可能它已被更改),還是使用正確的select調用,它是「真正的」異步io?Java中的異步IO?

+6

底層流支持它的地方。NET使用IO完成端口和一個ThreadPool線程來執行回調。 – 2009-02-26 20:31:54

+0

喬恩,什麼時候底層流不支持它? – 2010-05-04 21:10:54

+0

關於爲什麼不使用java.nio的任何具體原因?實際上,我正在嘗試在我的項目中實施一些異步I/O,並且我之前沒有使用過任何一個。因此想知道。謝謝。 – Bhushan 2011-06-23 17:31:49

回答

44

Java的NIO軟件包(自Java6起)僅通過Selector s提供對非阻塞I/O的支持。 Java7有望與NIO.2一起發佈,其中包括異步I/O支持。今天,你最好的選擇是利用框架。 ARMistice提到了Mina。這裏有一些其他的。

  1. Grizzly。這是Sun的GlassFish服務器的I/O核心。 Grizzly提供了一個用於執行異步讀/寫操作的工具(通過隊列模型)。它支持TCP和UDP。我在一些項目中使用了灰熊隊。有一些我喜歡和不喜歡的框架,但要詳細說明這是另一個話題。我會說,讓事情變得很容易,灰熊爲你做了很多繁重的工作。
  2. Netty。該項目來自Mina項目的原作者之一。我沒有使用過這個,所以我不知道它對異步I/O的支持。你應該看看。

現在,關於關於線程的問題,NIO選擇器不使用線程進行非阻塞I/O。在JDK6中,他們使用Windows下的select()以及更新Linux內核上的epoll工具。對於異步I/O,線程細節取決於框架。

12

java.nio只是一個包 - 「啞」類的集合 - 它本身並沒有使用任何線程的使用。如果使用得當,例如在Reactor design pattern中,則可以實現正確的,可完全擴展的異步I/O。

+0

你的答案似乎對我而言是合法的,但你能解釋更多嗎?請多一點解釋。 – 2017-01-05 15:28:44

6

如果您有興趣將它用於網絡資料。一個非常好的選擇是:

http://mina.apache.org/

看一看有其易於使用和非常強大的。

15

關於庫的另一個建議是Naga(http://naga.googlecode.com)。它不像一個框架,更像一個圖書館。它試圖看起來更像普通的java套接字,如果那是你的一杯茶。與灰熊,米娜和內蒂相比,它極其簡約。

2

對於原始問題,在Unix/Linux系統上,實現僅在一種情況下每個I/O操作佔用一個線程,即AsynchronousFileChannel。

16

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甚至會更好。