Запутался в параллельности и потоках Java - PullRequest
0 голосов
/ 18 января 2019

Прочитав о параллелизме с потоками Java, я немного запутался. Некоторые утверждают (они могут ошибаться), что потоки Java выполняются одновременно?

Если у вас есть 4 ЦП, которые могут выполнять многопоточность (могут обрабатывать 8 потоков), как получается, что при создании 30 потоков в коде Java все они выполняются одновременно (одновременно)? Насколько мне известно, только 4 могут быть запущены одновременно, а остальные 4 потока ожидают выполнения, а 22 находятся в пуле очередей. Я что-то упускаю или неправильно понимаю термин?

Ответы [ 2 ]

0 голосов
/ 18 января 2019

Все ваши потоки будут работать одновременно, если они не заблокированы, ожидая друг друга или ожидая некоторого ввода-вывода. Они не будут ждать завершения друг друга (если вы не запрограммируете это таким образом с помощью пулов потоков ограниченного размера или завершаемых фьючерсов).

Теперь уровень и производительность параллелизма будут определяться имеющимся у вас оборудованием (чем больше ядер, тем лучше) и механизмом планирования потоков базовой операционной системы.

Помните, что параллельно с вашей программой в вашей операционной системе также будут другие процессы (каждый из которых также требует времени процессора). Механизм параллелизма между процессами и потоками похож (если они не являются потоками пользовательского уровня). Операционная система сделает переключение контекста в подходящее время. Вы не должны замечать это в своей программе (если другие процессы не являются действительно интенсивными процессорами).

0 голосов
/ 18 января 2019

Все просто - в вашем сценарии запускается 30 потоков, но только 4 из них выполняются одновременно (в данный момент). Нитки выполнены поочередно. Куски из любого потока могут быть выполнены, но только 4 в данный момент.

Если бы у вас было 2 строительные команды (Ядра), которые построили бы 10 домов (Нитей) одновременно, но каждый дом строился бы только по 4 часа в день одной командой (планирование потоков), вы все равно сказали бы, что 10 дома строятся одновременно, но не обязательно в одно и то же время (так как только 2 из них будут построены в один и тот же момент).

То же самое происходит с потоками в ОС и JVM.

...