2015-04-14 4 views
0

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

Приложение имеет список устройств, хранящихся в наблюдаемом списке.

  1. приложение инициализирует, поток пользовательского интерфейса запускает
  2. UI поток вызывает поток unitActiveTask, чтобы начать мониторинг, если устройства активны, это работает всегда в фоновом режиме.
  3. Пользователь может вызывать определенные сервисы и задачи, в то время как остальные 2 потока выполняются. примеры задач и услуг (на самом деле не уверен, что разница между услугами и задачи)
    • удаления устройства из списка
    • загрузить файл на устройство (прошивки, конфигурация) (может занять очень много времени)
    • генерируют конфигурацию (сгенерировать файл свойств, который содержит произвольные значения, занимает 1-5 секунд)
    • несколько других подобных действий

Можно предположить, что блок unitActiveTask не должен блокироваться. Другие задачи могут блокировать пользователя до тех пор, пока они не будут выполнены. Единственное, что всегда должно быть отзывчивым, - это ui, unitActiveTask потенциально может быть приостановлен.

+0

Можете ли вы задать конкретный вопрос? Непонятно, о чем вы на самом деле спрашиваете. –

+0

вопрос в том, как бы вы нарисовали это? возможно, некоторые ссылки на некоторые ресурсы. Потому что существует так много вариантов. Задачи, runnables, потоки, исполнители и т. Д. Тогда есть соответствующие структуры данных, такие как блокирующие очереди, фьючерсы, блокировки. –

ответ

0

Этот вопрос, вероятно, слишком широк для этого форума; однако, посмотрите, достаточно ли этого, чтобы помочь:

A Task представляет собой одноразовую задачу, предназначенную для запуска в фоновом потоке. Он может вернуть значение и может генерировать исключения. Он имеет методы обратного вызова, которые выполняются в потоке прикладных программ FX (поэтому предназначены для обновления пользовательского интерфейса), которые вызываются в разных точках жизненного цикла, например setOnSucceeded(...) и setOnFailed(...). Кроме того, он имеет различные методы update...(...), которые обновляют свойства в потоке приложения FX. Каждый экземпляр Task может быть выполнен только один раз.

A Service имеет схожую функциональность с Task, но предназначен для многоразового использования. Таким образом, он имеет дополнительные методы, такие как reset() и restart(). Он работает путем создания и управления экземплярами Task (с помощью метода createTask(), который необходимо реализовать) и выполнения их на одном или нескольких потоках фона.

A ScheduledService является Service, который может генерировать его Task s через определенные промежутки времени.

Для вашего сценария:

Пункт 2: поскольку это один поток, работающий на время вашего приложения, он плохо подходит для Task (который предназначен для выполнения и возвращает значение) или Service (который фактически представляет собой только набор из Task). Для этого вы можете использовать ScheduledService для опроса устройств через определенные промежутки времени или просто создать поток и выполнить его в фоновом режиме.В последнем случае вы должны позвонить setDaemon(true) в поток, чтобы он не препятствовал завершению работы приложения. Если вы выберете опцию Thread, любые изменения, которые необходимо внести в пользовательский интерфейс в результате выполнения кода в потоке, необходимо активировать в потоке приложения FX, который вы можете сделать при вызове Platform.runLater(...). Если вы используете ScheduledService, вы можете сделать это, используя методы обратного вызова в службе или задачи, которые она создает.

Пункт 3: Create an Executor подходит для ваших нужд (или более одного, если необходимо). В обработчиках событий, которые запускают соответствующие задачи, создайте задачу, настройте ее, установив обработчики для onSucceeded и onFailed (при необходимости) и выполнив задачу в исполнителе. Вы можете отключить части пользовательского интерфейса перед отправкой задания, если это необходимо. Обработчик onSucceeded может повторно включить те части пользовательского интерфейса, а также обработать результаты задачи.

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