Что делает порядок выполнения потоков непредсказуемым? - PullRequest
9 голосов
/ 27 октября 2011

Что делает порядок выполнения потоков непредсказуемым?Планировщик в какой-то момент использует случайные числа или проверяет системные ресурсы или видит, какой поток ждал достаточно долго или ...?

Ответы [ 5 ]

10 голосов
/ 27 октября 2011

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

4 голосов
/ 27 октября 2011

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

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

1 голос
/ 27 октября 2011

Другие вопросы подтверждают технические детали, но:

Точнее, планирование потоков в Java довольно эффективно контролируется блокировками , wait / notify / notifyAll , sleep методы и другие средства управления параллелизмом.Только в те моменты времени выполнения приложения, , когда их нет , порядок выполнения различных потоков остается неопределенным .

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

0 голосов
/ 27 октября 2011

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

Это не случайно, но обычно непредсказуемо.

0 голосов
/ 27 октября 2011

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

...