Как загрузить процессы из очереди и запустить новый процесс, когда он заканчивается в Java? - PullRequest
1 голос
/ 24 марта 2020

Предположим, у меня есть очередь объектов Process, которые будут выполнять программу на моем компьютере, а не однопоточную. Чтобы повысить эффективность, я хочу запускать 4 экземпляра одновременно, чтобы максимально эффективно использовать мой 4-ядерный процессор. Как я могу получить 4 элемента из очереди, начать их обработку и получить новый процесс из очереди вместо процесса, который завершился?

1 Ответ

1 голос
/ 25 марта 2020

Executor Framework

Java предоставляет все эти возможности для вас. Вам не нужно создавать ни класс Process, ни очередь.

Каждая из ваших задач должна реализовывать интерфейс Runnable или Callable.

Отправьте их в исполнительную службу, как описано в учебнике Oracle . Служба executor действует как ваша очередь, направляя отправленные задачи в доступный поток.

Для контроля выполнения ваших задач вы можете захватить возвращенный объект Future.

Если вы хотите Максимум четыре задачи должны выполняться одновременно, создайте службу executor с резервным пулом потоков из четырех потоков.

Но остерегайтесь чрезмерного планирования. Для четырехъядерного компьютера вы можете использовать менее четырех потоков, если ваши задачи требуют значительных ресурсов процессора. На вашем компьютере есть другие задачи, такие как задачи ОС, запуск JVM и запуск других приложений. С другой стороны, если ваши задачи не нагружают процессор, поэтому они тратят много времени на ожидание, например, на ожидание возврата сетевых вызовов, то вам может потребоваться больший пул потоков.

Все это было рассмотрено многими раз уже на переполнение стека. Так что ищите, чтобы узнать больше.

И обязательно прочитайте книгу Java Параллелизм на практике Гетца и др.

...