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

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

Ответ 1

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

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

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

Ответ 2

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 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 (...)

Update: Если вы можете использовать модель актера, то AKKA TCP IO будет еще лучше.

Ответ 3

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

Ответ 4

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

Ответ 5

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

http://mina.apache.org/

Посмотрите там свою простую в использовании и очень мощную.

Ответ 6

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