Зачем нужен yield, поскольку любой поток может переходить в состояние готовности даже без вызова метода yield - PullRequest
0 голосов
/ 11 июля 2019

Я читал о урожайности.Говорят, что если поток выполняется долго и если другой поток, который будет работать в течение короткого времени, должен ждать, пока поток завершит свою обработку.Но мой вопрос в том, что касается планировщика потоков, ни один поток не будет работать до его завершения за один раз.он должен колебаться между рабочим и готовым состояниями.так будет и с долго работающей нитью.через некоторое время он перейдет от запуска к готовности, а затем возобновит работу, и этот цикл будет продолжаться, пока не завершит свою работу.тогда какова роль доходности?Является ли это просто добровольным способом перехода в состояние готовности, чтобы увидеть, нужно ли кому-либо время процесса?

Ниже приведена информация от https://www.geeksforgeeks.org/java-concurrency-yield-sleep-and-join-methods/, которая не смогла очистить мое сомнение.

yield (): Предположим, есть три потока t1, t2 и t3.Поток t1 получает процессор и начинает его выполнение, а потоки t2 и t3 находятся в состоянии Ready / Runnable.Время завершения для потока t1 составляет 5 часов, а время завершения для t2 составляет 5 минут.Поскольку t1 завершит свое выполнение через 5 часов, t2 должен ждать 5 часов, чтобы просто завершить 5-минутную работу.В таких сценариях, когда одному потоку требуется слишком много времени для завершения своего выполнения, нам нужен способ предотвратить выполнение промежуточного потока, если ожидается что-то важное.yeild () помогает нам в этом.yield () в основном означает, что поток не выполняет ничего особенно важного, и если необходимо запустить какие-либо другие потоки или процессы, они должны выполняться.В противном случае текущий поток продолжит работу.

1 Ответ

0 голосов
/ 12 июля 2019

yield() говорит среде выполнения Java: «Теперь вы можете перейти к другому потоку».В текущих операционных системах (таких как Unix или Windwos), которые имеют собственные потоки и вытесняющую многозадачность, долго работающий поток будет в конечном итоге приостановлен, а другие потоки будут выполняться.С yield() это возможно произойдет раньше.

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

...