Java-связь между потоками и процессорами
Я довольно новичок в многопоточности, и я работаю над проектом, где я пытаюсь использовать 4 процессора в своей Java-программе. Я хотел сделать что-то вроде
int numProcessors = Runtime.getRuntime().availableProcessors();
ExecutorService e = Executors.newFixedThreadPool(numProcessors);
будет ли это гарантировать, что у меня будет один поток, работающий на CPU? В то время, когда я создаю потоки, система не будет занята, однако через некоторое время она будет чрезвычайно занята. Я думал, что ОС выберет наименее загруженный процессор для создания потоков, но как это работает, если ни один из них особенно занят во время творения?
кроме того, служба пула потоков должна повторно использовать потоки, но если она увидит, что на другом процессоре больше доступности, она убьет поток и породит новый?
3 ответов
будет ли это гарантировать, что у меня будет один поток, работающий на CPU?
Если у вас есть четыре задачи, которые необходимо выполнить одновременно, вы можете ожидать, что у них есть поток. В HotSpot JVM он создает объект Thread, который является прокси для фактического потока при создании пула. Когда фактические потоки создаются и как, имеет значение для вас.
во время создания потоков система не будет занята, однако некоторое время спустя он будет чрезвычайно занят. Я думал, что ОС выберет наименее загруженный процессор для создания потоков, но как это работает, если ни один из них не особенно занят во время создания?
потоки создаются ОС и добавляются в список потоков для планирования.
кроме того, служба пула потоков должна повторно использовать потоки, но если она увидит, что на другом процессоре больше доступности, она убьет поток и породить там нового?
Java не имеет права голоса в этом вопросе. ОС решает. Он не убивает и не перезапускает потоки.
потоки не привязаны к процессорам так, как вы предлагаете. ОС передает потоки между процессорами, на основе которых нужно запускать потоки и какие процессоры свободны.
нет, это не гарантирует ничего о том, где работают потоки
на самом деле планировщик потоков ОС может свободно переносить потоки вокруг ядер по своему усмотрению (так что одна строка может быть на core 0, а следующая на core 4)
вы можете установить сродство потоков, но это не доступно в java напрямую (AFAIK)
" если он увидит, что на другом процессоре больше доступности, он убьет поток и породит новый?"
нет необходимости убивать и порождать другой, чтобы использовать доступный процессор. Потоки-это объекты памяти, которые не привязаны к определенному процессору и могут перемещаться от одного процессора к другому. Выполнение потока-это цикл, подобный этому:
-
Thread.start()
помещает поток в очередь процессора - когда доступен процессор, планировщик берет первый поток в очереди процессора и ставит на процессор
- когда поток блокирует занятую блокировку или ожидает окончания операции ввода-вывода, он снимается с процессора и помещается в соответствующую очередь. После освобождения блокировки или завершения операции ввода-вывода поток перемещается из этой очереди обратно в очередь процессора.
- когда поток работает слишком долго без блокировки (O / S зависимое время, скажем, 50 мс), происходит прерывание, и планировщик смотрит, есть ли потоки в очереди процессора. Если есть, текущий поток снимается с процессора и помещается в конец очереди процессора, а первый поток в очереди он помещается на процессор. Таким образом, длинный поток позволяет выполнять и другие потоки.
в результате, потоки часто меняют свое состояние, но это прозрачно для программиста. Вся идея threads заключается в том, что thread-это модель процессора, более удобная, чем реальная процессор. Используйте эту модель и не беспокойтесь о сопоставлении потоков на процессорах, пока вам это не понадобится.