Для многопоточного приложения yield
приведет к тому, что выполняющийся в данный момент поток приостановит выполнение и будет переведен в состояние ожидания. Затем JVM начнет запускать другой поток, который ранее находился в состоянии ожидания.
Я полагаю, что тот же поток, который только что получен, технически может быть запланирован для повторного запуска.
А мне еще предстоит увидеть это в дикой природе. Поэтому я думаю, что это безопасно избегать.
Для уточнения:
В многопоточной среде потоки по расписанию и внеплановому расписанию отключаются и включаются по желанию JVM. Таким образом, даже если yield не вызывается в коде, ваш поток может / будет автоматически уступать другим потокам, когда JVM решит, что должно. Это позволяет многопоточности работать в среде только с одним ядром обработки.
Вызов yield возвращает просто JVM для перевода текущего потока в состояние ожидания, даже если JVM не собиралась.
Я попробую иллюстрацию:
Ниже приведена очень упрощенная иллюстрация выполнения двух потоков с течением времени (предположим, одно ядро) -
Thread\Time 1 2 3 4 5 6 7 8 9
Thread 1 ----------- ----- -------
Thread 2 ------- ---------- ------
Всякий раз, когда вы видите '-'
, это означает, что выполняется поток. ' '
означает, что поток ожидает. Как видите, одновременно может работать только 1 поток. Итак, пока работает 1, другой ждет. То, что предполагается сделать с помощью yield, - это дать другим потокам шанс опередить текущий запущенный поток.