ForkJoinPool & Asynchronous IO - PullRequest
       51

ForkJoinPool & Asynchronous IO

0 голосов
/ 21 сентября 2018

В одном из моих вариантов использования мне нужно получить данные с нескольких узлов.Каждый узел поддерживает диапазон (раздел) данных.Цель состоит в том, чтобы прочитать данные как можно быстрее.Ограничения в том, что мощность раздела не известна заранее.Используя подход к распределению работы, я мог бы разделить разделы на подразделы и получать данные параллельно.Одним из недостатков этого подхода является то, что один поток может извлечь много данных и занять больше времени, в то время как другой поток может завершить работу быстрее.Другой подход заключается в использовании кражи работы, когда мы можем разбить разделы на гораздо меньшие диапазоны и использовать ForkJoinPool.Недостаток этого подхода заключается в том, что если раздел является разреженным, мы могли бы совершить множество обращений к серверу, чтобы понять, что для подраздела нет данных.

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

1 Ответ

0 голосов
/ 04 октября 2018

Структура fork-join является реализацией интерфейса ExecutorService, который помогает ускорить параллельную обработку, пытаясь использовать все доступные ядра процессора.Оберните ваш код в подкласс ForkJoinTask, обычно используя один из его более специализированных типов, либо RecursiveTask (который может возвращать результат), либо RecursiveAction.

// create sub tasks
// submit them to the common Fork/Join pool
ForkJoinTask.invokeAll(subTaskOne, subTaskTwo);
// Merge the results

Затем вернитесь к асинхронному программированиюна Яве.Единственный способ сделать асинхронность в Java8 - использовать CompletionStage API .Этот API может использовать общий пул Fork / Join или подключить к нему свой собственный ExecutorService.

Вот пример использования пула Fork / Join с асинхронным вводом-выводом.

Runnable task = () -> System. out .println ("Hello world!" );
CompletableFuture <Void > completableFuture = CompletableFuture.runAsync (task);

По умолчанию эти задачи выполняются в общем пуле Fork / Join.

...