2016-08-16 2 views
2

Я могу найти old references и SO ответы, которые говорят, что поведение Thread.yield() зависит от платформы. This answer указывает, что это связано с тем, что поведение на самом деле не указано.Thread.yield() все еще кросс-платформенное минное поле?

Возможно ли это в случае с современными версиями Java, что поведение Thread.yield() зависит от платформы?

Редактировать

Я уже прочитал документацию. Я понимаю, что это означает. Я спрашиваю о фактическом поведении.

+0

Да. См. [Документация] (https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html#yield--) ". Подсказка к планировщику, который текущий поток готов дать его текущее использование процессора. Планировщик может игнорировать этот hint._ « –

+0

_ Я спрашиваю о фактическом поведении_ Для чего JVM? –

+0

@SotiriosDelimanolis все вышеперечисленное. Если поведение совместимо на всех платформах, кроме CarrotJVM в Windows, то это актуально. –

ответ

5

Из Java 8 API (последняя не-беты на сегодняшний день):

намек на планировщик, что текущий поток готов уступить свое текущее использование процессора. Планировщик может игнорировать этот намек.

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

Редко использовать этот метод. Это может быть полезно для целей отладки или тестирования , где это может помочь воспроизвести ошибки, вызванные , условиями гонки. Это также может быть полезно при разработке параллельных вычислений таких конструкций управления, как те, что содержатся в пакете java.util.concurrent.locks .

Последствия являются:

  • Да, по-прежнему зависит от платформы
  • Да, эвристический
2

Даже если точные детали Thread.yield() поведения различны на разных платформах, метод звоните еще в основном ничего не делает.

Вы вызываете его, и он ничего не делает, и он возвращает как можно быстрее по модулю тот факт, что он может или не может заканчивать текущий срез времени потока.

Является ли это «кросс-платформенным минным полем»?

Если вы пишете код, который не будет работать, если Thread.yield() на самом деле не заканчивает срез времени звонящего, тогда вы написали код для конкретной платформы. Но Java, вероятно, не должен быть вашим языком выбора, если вам нужно поведение конкретной платформы.

+1

Утоление - это не анахронизм.Верьте или нет, не все ядра на всех процессорах полностью посвящены вашему приложению. Доходность по-прежнему используется. Я согласен, что это не минное поле, но у него есть цель. –

+0

@GabeSechan, спасибо. Я немного смягчил его. –

Смежные вопросы