Асинхронный ввод / вывод в Java?
какие параметры для асинхронного ввода-вывода (на основе сокетов) есть в java, кроме java.НИО? Также делает java.nio использует потоки в фоновом режиме (как я думаю, асинхронная библиотека .NET-сокетов, возможно, она была изменена) или это "истинный" асинхронный io с использованием правильного вызова select?
6 ответов
пакет NIO Java (начиная с Java6), обеспечивает поддержку неблокирующий ввод-вывод только через селекторs. Java7, надеюсь, будет поставляться с NIO.2, который включает асинхронный I/O поддержка. Сегодня лучше всего использовать фреймворк. Перемирие упомянуло мину. Вот еще несколько.
- Гризли. Это ядро ввода-вывода для Sun's GlassFish сервер. Grizzly обеспечивает средство для делать асинхронный чтение / запись (через модель очереди). Он поддерживает TCP и UDP. Я использовал гризли в нескольких проектах. Есть вещи, которые мне нравятся и не нравятся в рамках, но подробно это действительно другая тема. Я скажу, что это довольно легко получить что-то и работает, и Гризли делает много тяжелой работы для вас.
- Нетти. Этот проект исходит от одного из первоначальных авторов проекта 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.
Если вы заинтересованы в использовании его для сетевых материалов. Действительно хороший выбор:
посмотреть там его простой в использовании и очень мощный.
к исходному вопросу реализация потребляет только поток на операцию ввода-вывода в одном случае, AsynchronousFileChannel в системах Unix/Linux.