Javafx - одновременное повторное использование сервиса javafx <> - PullRequest
0 голосов
/ 22 октября 2018

В JavaFx задача многократного использования обычно реализуется на javafx.concurrent.Service<>.

Вопрос: как управлять несколькими взаимодействиями пользовательского интерфейса, которые запускают Сервис несколько раз?

Подход1 - restart ():

Я мог бы использовать service.restart (), но он отменяет запущенную задачу и запускает новую.Это нежелательный результат, так как я не хочу отменять первый.

Подход 2 - start ():

Для возможности использовать start () более одного раза я должен был бы сделать это:

if(!isRunning()) {
    reset();
    start();
}

Но если isRunning() имеет значение true, второй запуск игнорируется.

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

Как бы этого достичь?

1 Ответ

0 голосов
/ 23 октября 2018

Если вы хотите, чтобы пользователи не пытались запускать Service два или более раз одновременно, просто отключите все узлы пользовательского интерфейса, которые запускают Service во время его работы.Один из способов сделать это - связать свойство disable Node со свойством running Service.

Если вы хотите поставить в очередь выполнение, то это зависит от того, что Service требуется.Например, нужен ли какой-либо вклад?Если нет, просто используйте переменную requests и увеличивайте / уменьшайте ее по мере необходимости.

public class Controller {

    private int requests;
    private Service<Object> service = new Service<>() {

        @Override
        protected Task<Object> createTask() {
            // create and return Task...
        }

        @Override
        protected void succeeded() {
            if (requests > 0) {
                requests--;
                restart();
            } 
        }

    };

    @FXML
    private void startService() {
        if (service.isRunning()) {
            requests++;
        } else {
            service.start();
        }
    }

}

Если Service (или, более конкретно, Task) действительно требуется ввод, который вы все равно делаетечто-то похожее.Однако вместо использования int для отслеживания количества запросов вы бы использовали Queue (или какой-либо другой подобный объект), который содержит необходимую информацию для каждого Task.Когда Service завершится и Queue не будет пустым, перезапустите Service и возьмите следующий элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...