key, value = max(stats.iteritems(), key=lambda x:x[1])
Если вы не заботитесь о ценности (я был бы удивлен, но), вы можете это сделать:
key, _ = max(stats.iteritems(), key=lambda x:x[1])
Мне нравится распаковка кортежей лучше, чем индекс [0] на конец выражения. Мне очень не нравится читаемость лямбда-выражений, но найти это лучше, чем operator.itemgetter (1) IMHO.
Реализация интерфейса Callable в классе задач. И передать задачу в executorService.Submit (Task); который вернет экземпляр Future. Вызвать future.get (), который будет ожидать завершения выполнения блока Call
Лучше иметь энергозависимый флаг 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
, поскольку вы не выключили исполнителя и не могут использоваться для проверки состояния отдельных задач. Эти методы сообщат вам состояние исполнителя.
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 .