Возможно ли установить приоритет потоков, отличных от JavaFX, над потоком JavaFX?

#java #multithreading #user-interface #javafx #thread-priority

#java #многопоточность #пользовательский интерфейс #javafx #приоритет потока

Вопрос:

У меня есть приложение JavaFX, с помощью которого я получаю информацию от оборудования, используя:

 Platform.runLater(new Runnable() {
    @Override
    public void run() {

    }
});
 

проблема в том, что иногда, если не всегда, я хочу расставить приоритеты при сборе данных для точности. Есть ли альтернатива runLater, которая, возможно, временно останавливает поток JavaFX? Или возможно ли иметь приложение, в котором поток JavaFX является подпотоком?

Комментарии:

1. Как часто вы звоните runLater ?

2. У меня есть два слушателя, один для полученных данных, один для изменений в текстовой области (в результате полученных данных). Оба вызывают runLater.

3. Прослушиватель текстовой области не имеет значения, поскольку пользователь не может печатать достаточно быстро, чтобы генерировать множество вызовов runLater. Как часто вы получаете данные? То, что я пытаюсь понять, — это почему вы считаете, что установка приоритета потока вообще будет иметь какое-либо желаемое значение в вашем случае?

4. Последовательные данные со скоростью передачи 115200 бод.

5. Это безумие 😉 Импульсы JavaFX по умолчанию ограничены частотой 60 в секунду, поэтому нет необходимости вызывать runLater чаще, чем 60 раз в секунду, иначе вы напрасно затопите диспетчер событий JavaFX, что приведет к ужасной производительности. В любом случае, похоже, у вас есть решение, которое заключается в пакетной обработке ваших входных данных, а затем в периодической передаче данных пакетами в поток JavaFX для обработки с помощью runLater().

Ответ №1:

Остановка потока JavaFX приведет к зависанию пользовательского интерфейса!

Надеюсь, вы этого не ищете!

Если вы хотите установить приоритет для части сбора данных, просто запустите ее в другом рабочем потоке (задаче), который будет выполняться параллельно потоку JavaFX, и как только сбор данных будет завершен, используйте runLater , чтобы обновить его обратно в пользовательский интерфейс!

Комментарии:

1. Когда вы говорите «замораживание пользовательского интерфейса», означает ли это постоянно или временно? Поскольку приложение временно не реагирует, это также вариант для моего решения.

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

3. Спасибо, я обязательно рассмотрю это.

4. В итоге я использовал runLater таймер для периодического добавления данных, уменьшая количество вызовов. Должно быть, я забыл, что делал мой собственный код, потому что, похоже, сбор данных происходил в отдельном потоке от потока приложения JavaFX (я не думаю, что это сработало бы иначе), он просто добавлялся к каждому событию ввода данных, вызывая runLater намного чаще, чем оптимально. Итак, 1 для » после завершения сбора данных».