Этот вопрос, вероятно, слишком широк для этого форума; однако, посмотрите, достаточно ли этого, чтобы помочь:
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
может повторно включить те части пользовательского интерфейса, а также обработать результаты задачи.
Можете ли вы задать конкретный вопрос? Непонятно, о чем вы на самом деле спрашиваете. –
вопрос в том, как бы вы нарисовали это? возможно, некоторые ссылки на некоторые ресурсы. Потому что существует так много вариантов. Задачи, runnables, потоки, исполнители и т. Д. Тогда есть соответствующие структуры данных, такие как блокирующие очереди, фьючерсы, блокировки. –