Неопределенная задача в ExecutorService

key, value = max(stats.iteritems(), key=lambda x:x[1])

Если вы не заботитесь о ценности (я был бы удивлен, но), вы можете это сделать:

key, _ = max(stats.iteritems(), key=lambda x:x[1])

Мне нравится распаковка кортежей лучше, чем индекс [0] на конец выражения. Мне очень не нравится читаемость лямбда-выражений, но найти это лучше, чем operator.itemgetter (1) IMHO.

1
задан A1ex NS 17 January 2019 в 06:35
поделиться

3 ответа

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

0
ответ дан Sagar 17 January 2019 в 06:35
поделиться

Лучше иметь энергозависимый флаг 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, поскольку вы не выключили исполнителя и не могут использоваться для проверки состояния отдельных задач. Эти методы сообщат вам состояние исполнителя.

0
ответ дан Amardeep Bhowmick 17 January 2019 в 06:35
поделиться

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
ответ дан Slaw 17 January 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: