Планировщик потоков в Java с одним процессором?
Я читал, что планировщик потоков в Java запускает только один поток за один раз в одном процессе.
Допустим, у нас есть одна JVM, работающая с одним процессором. Так что, если я запущу 10 потоков, они будут управляться одним и тем же планировщиком потоков.
Если один поток выполняется одновременно, как это происходит одновременно? Разве это не иллюзия параллелизма?
Могу ли я запустить 10 потоков одновременно в одном процессе под одной и той же JVM?
2 ответа
1- Если одновременно выполняется один поток, как это происходит одновременно? Разве это не иллюзия параллелизма?
Это иллюзия и реальность. Обе задачи чередуются друг с другом без вашего вмешательства. Таким образом, это действительно одновременно и очень полезно для организации кода. Было бы абсолютным кошмаром запускать несколько задач одновременно без многопоточности, чтобы выполнить переключение за вас.
Тем не менее, один процессор никогда не запускает несколько потоков в любой момент, потому что он может выполнять только одну операцию за раз, и в этом смысле это иллюзия.
2- Могу ли я запустить 10 потоков одновременно в одном процессе под одной и той же JVM?
Ага. См. /questions/16680533/maksimalnoe-kolichestvo-potokov-v-jvm/16680549#16680549.
Резюме: вам доступно несколько тысяч тем.
Здесь работают разные вещи. Таким образом, одно ядро процессора может одновременно запускать только один поток ядра. Сколько потоков ядра может быть запущено для одного процесса JVM, зависит от JVM. Однако даже с одним потоком ядра наличие нескольких потоков Java может увеличить ваш параллелизм. Несмотря на то, что каждый поток должен иметь временной интервал, он позволяет неблокированному потоку выполнять операции, в то время как другой поток блокируется, что приводит к общему сокращению времени выполнения. Представьте, что поток А выполняет сетевой вызов и ожидает результата. Поток B может вступить во владение, пока A ожидает, и выполнить некоторые вычисления. Если бы это было только синхронно, выполняемые вычисления B не могли бы начаться до тех пор, пока не вернется сетевой вызов.