Итак, здесь я читаю одну из моих любимых программных паттернов (Pattern-Oriented Software Architecture - Шаблоны для параллельных и сетевых объектов), в частности разделы для асинхронных шаблонов ввода-вывода Proactor/Reactor. Я вижу, как с помощью выбираемых каналов я могу реализовать асинхронный механизм ввода-вывода типа Reactor довольно просто (и сделал это). Но я не могу понять, как бы я реализовал надлежащий механизм Proactor с неблокирующей записью. Это использует функции неблокирующей записи, управляемые ОС.
Функциональность, поддерживаемая конкретными вызовами ОС, такими как GetQueuedCompletionStatus под win32.
Я видел, что Java 7 приносит некоторые обновления для NIO с асинхронными обработчиками завершения (которые, кажется, находятся в правильном направлении). Это говорит... Учитывая отсутствие единой кросс-платформенной поддержки OS-асинхронных операций (в частности, асинхронную запись), я предполагаю, что это квази-реализация, которая не использует поддержку родной ОС.
Итак, мои вопросы: возможно ли использование IO на основе proactor в Java таким образом, что выгодно использовать для определенных сценариев; и, если Java NIO поддерживает поддержку ввода-вывода на основе proactor (либо на Java 6, либо на Java 7), используется ли поддержка асинхронного ввода-вывода под управлением ОС (то есть завершение обратных вызовов из ОС)? Более того, если реализация является чисто виртуальной в-ВМ, это настолько малоэффективно, что использование проактивной обработки событий предлагает не что иное, как другой (возможно, более простой) способ создания параллельного программного обеспечения для обработки сети.
Для всех, кто заинтересован в упреждающей обработке событий вот хорошая статья, в которой указаны плюсы/минусы и сравнение с традиционным потоком за соединение и реактивные модели ввода-вывода.