Неопределенная задача в ExecutorService - PullRequest
0 голосов
/ 17 января 2019

У меня есть следующие переменные:

    private ExecutorService executor;
    private Task<Boolean> worker;

У меня есть задача, которую нужно выполнить в другом потоке, и состояние которой нужно отслеживать:

    public Worker<Boolean> updateTemplateBuffer() {
    worker = new Task<Boolean>() {
        @Override
        protected Boolean call() throws Exception {
               //task code
    };
    executor.execute(worker);
    return worker; 
}

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

Методы executor.isTerminated() и executor.isShutdown() всегда false в любое время вызова. Подскажите, как правильно отслеживать состояние задачи (запущено или завершено), потому что раньше я никогда не сталкивался с многопоточным программированием.

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Реализация интерфейса Callable в классе задач.И передать задачу в executorService.Submit (Task);который вернет экземпляр Future.Вызвать future.get (), который будет ждать, пока блок Call не завершит выполнение

0 голосов
/ 17 января 2019

Task реализует интерфейс Worker, который имеет свойство state. Вы можете прослушать это свойство и реагировать, когда Worker.State изменяется на SUCCEEDED, CANCELLED или FAILED.

Task<Boolean> task = ...;
task.stateProperty().addListener((obs, oldVal, newVal) -> {
    // Test newVal and do something as needed...
});

Или вы можете прослушать свойство running.

task.runningProperty().addListener((obs, oldVal, newVal) -> {
    if (!newVal) {
        // Do something...
    }
});

Вы также можете прослушивать WorkerStateEvent с на Task.

task.setOnSucceeded(event -> {});
task.setOnCancelled(event -> {});
task.setOnFailed(event -> {});

// or even something like
task.addEventHandler(WorkerStateEvent.ANY, event -> {
    // Test event type and do something as needed...
});

Также есть защищенные "методы состояния".

Task<Boolean> task = new Task<>() {

    @Override
    protected Boolean call() throws Exception {
        return false;
    }

    @Override protected void succeeded() {}
    @Override protected void cancelled() {}
    @Override protected void failed() {}

});

Все эти опции будут уведомлять вас в ветке приложения JavaFX .

0 голосов
/ 17 января 2019

Лучше иметь энергозависимый флаг completed в вашем Task и установить в true, как только вся логика будет выполнена.

class Task implements Callable<Boolean>{
    private volatile boolean completed = false;
    @Override
    public Boolean call() throws Exception {
        //task code
        completed = true;
    }
    public boolean isCompleted(){
        return this.completed;
    }
}

Методы executor.isTerminated() и executor.isShutdown() всегда возвращают false, поскольку вы не выключили исполнителя и не могут использоваться для проверки состояния отдельных задач. Эти методы сообщат вам состояние исполнителя.

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