2014-11-13 4 views
2

Почему JavaFX Application thread всегда RUNNABLE?JavaFX thread always runnable

Следующий экран из YourKit профилировщика (VisualVM показывает сходную картину, хотя):

enter image description here

Желтых части означают ждет состояния, светло-зеленый - работоспособной и темно-зеленый, когда нить на самом деле работает (видимый в stacktrace)

EDT от Swing ждет событий и ждет в противном случае, но что на самом деле делает поток JavaFX под капотом? Может ли его 100% -ное работоспособное состояние привести к утечкам производительности?

ответ

3

Справочная информация по теме заявляет

Согласно документации Thread.State.RUNNABLE: состояние

темы для работоспособный нити. Поток в состоянии runnable выполняется на виртуальной машине Java, но он может ожидать других ресурсов из операционной системы, таких как процессор.

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

Вы можете видеть из этого Java thread state UML diagram, что для потоков Java существуют разные методы для ввода разных состояний. В Swing один из этих методов используется для получения EDT в состоянии ожидания, но аналогичные методы не используются в JavaFX.

Как JavaFX работает

architecture of the JavaFX system основан на Интервальный импульс, который по умолчанию будет срабатывать в 60 раз в секунду. Чтобы получить гладкий анимированный дисплей без разрыва изображения (я думаю), система может включить таймер vsync, чтобы импульсы синхронизировались с дисплеем. Стандартная JVM не знает о специфичном для ОС vsync-таймере, поэтому система JavaFX использует собственный код, чтобы заставить поток приложений JavaFX ждать по установленному ОС vsync-таймеру.

Это не проблема

ли его 100% работоспособное состояние может привести к утечкам производительности?

Нет, я не думаю, что состояние приведет к утечкам производительности.

Одна вещь, о которой нужно знать, это то, что поток приложений JavaFX предназначен для обновлений пользовательского интерфейса, поэтому все, что работает на нем, будет выполняться не более 60 раз в секунду по умолчанию. Поэтому, если вы используете что-то вроде PauseTransition и устанавливаете продолжительность паузы на Duration.millis (10), пауза на самом деле не будет 10 миллисекунд, а 60 секунд (около 16 миллисекунд).

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

Главное внимание при использовании потока приложений JavaFX состоит в том, чтобы убедиться, что вы выполняете всю свою работу и освобождаете поток (желательно в течение шестидесятой секунды), так что пользовательский интерфейс и обработка событий не являются задерживается вашей заявкой, но это соображение такое же, как для Swing, поэтому ничего нового нет.

Импульсного Определение

Из обзора архитектуры JavaFX (чтобы помочь понять, как импульсы относятся к обработке событий):

Когда импульс срабатывает, состояние элементов на графе сцены синхронизируется до уровня рендеринга. Импульс позволяет разработчикам приложений обрабатывать события асинхронно. Эта важная функция позволяет системе выполнять пакетные операции и выполнять события на пульсе. . , , Инструмент Glass Windowing Toolkit отвечает за выполнение импульсных событий. Для выполнения выполнения он использует собственные таймеры высокого разрешения.

Отказ

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

Дополнительная информация

Если вы заинтересованы в расследовании больше, вы можете просмотреть Timer и WinTimer код или другой код открытого JFX кода базы или задать дополнительные JavaFX архитектуры вопросы по рассылке openjfx-dev JavaFX разработчиков список. Разработчики более осведомлены о таких вещах, чем я, и смогут делать такие вещи, как подтверждение моих спекуляций, например, как синхронизировать импульсы.

+0

Спасибо за такой подробный ответ! –

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