Асинхронный ввод-вывод в Java? - PullRequest
57 голосов
/ 26 февраля 2009

Какие параметры для асинхронного ввода-вывода (на основе сокетов) существуют в java, кроме java.nio? Также java.nio использует потоки в фоновом режиме (как я думаю, что .NET async-socket-library может быть изменена) или это «истинный» async io с использованием правильного вызова select?

Ответы [ 6 ]

45 голосов
/ 27 февраля 2009

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

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

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

16 голосов
/ 29 января 2013

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

15 голосов
/ 04 апреля 2009

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

12 голосов
/ 26 февраля 2009

java.nio - это просто пакет - набор «глупых» классов - сам по себе он не использует потоки. При правильном использовании, например, в схеме проектирования Reactor , вы можете добиться правильного, полностью масштабируемого асинхронного ввода-вывода.

6 голосов
/ 26 февраля 2009

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

http://mina.apache.org/

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

2 голосов
/ 28 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...