Планировщик потоков в Java с одним процессором?

Я читал, что планировщик потоков в Java запускает только один поток за один раз в одном процессе.

Допустим, у нас есть одна JVM, работающая с одним процессором. Так что, если я запущу 10 потоков, они будут управляться одним и тем же планировщиком потоков.

  1. Если один поток выполняется одновременно, как это происходит одновременно? Разве это не иллюзия параллелизма?

  2. Могу ли я запустить 10 потоков одновременно в одном процессе под одной и той же JVM?

2 ответа

1- Если одновременно выполняется один поток, как это происходит одновременно? Разве это не иллюзия параллелизма?

Это иллюзия и реальность. Обе задачи чередуются друг с другом без вашего вмешательства. Таким образом, это действительно одновременно и очень полезно для организации кода. Было бы абсолютным кошмаром запускать несколько задач одновременно без многопоточности, чтобы выполнить переключение за вас.

Тем не менее, один процессор никогда не запускает несколько потоков в любой момент, потому что он может выполнять только одну операцию за раз, и в этом смысле это иллюзия.

2- Могу ли я запустить 10 потоков одновременно в одном процессе под одной и той же JVM?

Ага. См. /questions/16680533/maksimalnoe-kolichestvo-potokov-v-jvm/16680549#16680549.

Резюме: вам доступно несколько тысяч тем.

Здесь работают разные вещи. Таким образом, одно ядро ​​процессора может одновременно запускать только один поток ядра. Сколько потоков ядра может быть запущено для одного процесса JVM, зависит от JVM. Однако даже с одним потоком ядра наличие нескольких потоков Java может увеличить ваш параллелизм. Несмотря на то, что каждый поток должен иметь временной интервал, он позволяет неблокированному потоку выполнять операции, в то время как другой поток блокируется, что приводит к общему сокращению времени выполнения. Представьте, что поток А выполняет сетевой вызов и ожидает результата. Поток B может вступить во владение, пока A ожидает, и выполнить некоторые вычисления. Если бы это было только синхронно, выполняемые вычисления B не могли бы начаться до тех пор, пока не вернется сетевой вызов.

Другие вопросы по тегам