Асинхронный ввод / вывод в Java?

какие параметры для асинхронного ввода-вывода (на основе сокетов) есть в java, кроме java.НИО? Также делает java.nio использует потоки в фоновом режиме (как я думаю, асинхронная библиотека .NET-сокетов, возможно, она была изменена) или это "истинный" асинхронный io с использованием правильного вызова select?

6 ответов


пакет NIO Java (начиная с Java6), обеспечивает поддержку неблокирующий ввод-вывод только через селекторs. Java7, надеюсь, будет поставляться с NIO.2, который включает асинхронный I/O поддержка. Сегодня лучше всего использовать фреймворк. Перемирие упомянуло мину. Вот еще несколько.

  1. Гризли. Это ядро ввода-вывода для Sun's GlassFish сервер. Grizzly обеспечивает средство для делать асинхронный чтение / запись (через модель очереди). Он поддерживает TCP и UDP. Я использовал гризли в нескольких проектах. Есть вещи, которые мне нравятся и не нравятся в рамках, но подробно это действительно другая тема. Я скажу, что это довольно легко получить что-то и работает, и Гризли делает много тяжелой работы для вас.
  2. Нетти. Этот проект исходит от одного из первоначальных авторов проекта Mina. Я не использовал это, поэтому я не знаю о свою поддержку асинхронного ввода/вывода вы должны взглянуть.

теперь, что касается вашего вопроса о потоках, селекторы NIO не используют потоки для неблокирующего ввода-вывода в JDK6, они используют select () под Windows и средством epoll на новых ядрах Linux. Для асинхронного ввода-вывода потоковые данные зависят от структуры.


JAVA 7 прибыл, поэтому новый ответ-NIO.2 с будущим классом. Пример :

на стороне сервера:

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 было бы еще лучше.


другое предложение в отношении libs было бы Naga (http://naga.googlecode.com). Это немного меньше похоже на фреймворк и больше похоже на библиотеку. Он пытается больше походить на обычные сокеты java, если это ваша чашка чая. Это минималистично по сравнению с гризли, миной и Нетти.


java.nio - Это просто пакет-коллекция "немых" классов-сам по себе он не использует никаких потоков. При правильном использовании, например, в шаблон проектирования реактора, вы можете достигнуть правильного, полн-масштабируемого, асинхронного I / O.


Если вы заинтересованы в использовании его для сетевых материалов. Действительно хороший выбор:

http://mina.apache.org/

посмотреть там его простой в использовании и очень мощный.


к исходному вопросу реализация потребляет только поток на операцию ввода-вывода в одном случае, AsynchronousFileChannel в системах Unix/Linux.