Неблокирующая Asyn c IO в Java - PullRequest
       33

Неблокирующая Asyn c IO в Java

1 голос
/ 26 апреля 2020

Есть ли способ сделать асинхронный ввод-вывод в Java без блокировки каких-либо потоков (включая фоновые потоки)? Исходя из C#, мое понимание asyn c IO заключается в том, что когда вы вызываете

await ReadAsync()

Вызывающий поток (часть пула потоков) входит в ReadAsync Функция в какой-то момент вызывает функцию асинхронного чтения из ядра ОС, а затем добавляет себя обратно в пул потоков, чтобы получить другие Tasks. Как только чтение завершено, пул потоков уведомляется, и другой поток получает остальную часть Task.

In Java, с другой стороны, документация и этот ответ предполагает, что асинхронные функции ввода-вывода просто вызываются фоновым потоком, который затем блокируется. Это кажется менее производительным. Есть ли способ добиться истинного неблокирующего ввода-вывода в Java?

1 Ответ

1 голос
/ 08 мая 2020

AsynchronousFileChannel.open() возвращает экземпляры разных реализаций в соответствии с рабочей средой. На Windows он должен возвращать экземпляр WindowsAsynchronousFileChannelImpl, который использует порт завершения ввода-вывода и избегает блокирования потоков при операциях ввода-вывода. Потоки пула потоков используются только для отправки результатов и не блокируются, если только программист конечного пользователя не блокирует этот поток.

* RxIo построен поверх AF C и обеспечивает AsyncFiles эквивалентно синхронному классу Files, но с асинхронным API. Воспользовавшись стилем прохождения продолжения CompletableFuture (эквивалентно net Task), вы можете читать содержимое файла без блокировки:

AsyncFiles
  .readAll(path)
  .thenAccept(body ->     /* invoked on completion */)
  .exceptionally(excep -> /* invoked on error*/

Вы можете запустить модульные тесты RxIo и установите точку останова на open () и проверьте реализацию WindowsAsynchronousFileChannelImpl.

...