Task
класс добавляет кучу функциональности к FutureTask
, но все неочевидные части должны делать с обеспечением наблюдаемых свойств и обеспечение их обновления на FX Application Thread. Похоже, вам не нужны какие-либо из трудных частей: вы запрашиваете задачу, чтобы проверить ее прогресс (так что вам не нужна наблюдаемость, то есть обратные вызовы, которые будут вызваны при изменении хода), и у вас нет FX Тема приложения, на которой планируются обновления.
Так, например, если вы хотите отслеживать прогресс, просто добавьте соответствующее свойство в свою реализацию Callable
. Если вы хотите, чтобы прогресс был доступен из нескольких потоков, использовать атомную ссылку, чтобы представить прогресс внутри (или по крайней мере сделать его volatile
):
import java.util.concurrent.Callable ;
import java.util.concurrent.atomic.AtomicLong ;
public class MyCountingTask implements Callable<Void> {
private AtomicLong progressCount = new AtomicLong();
private final long max = 1000 ;
@Override
public Void call() throws InterruptedException {
for (int count = 0; count < max ; count++) {
progressCount.set(count);
// in real life, do actual work instead of sleeping...
Thread.sleep(100);
}
progressCount.set(max);
return null ;
}
public double getProgress() {
return 1.0*progressCount.get()/max ;
}
}
посмотреть на [FutureTask] (https: // Docs. oracle.com/javase/7/docs/api/java/util/concurrent/FutureTask.html#get()) и [Исполнитель] (https://docs.oracle.com/javase/7/docs/api/java /util/concurrent/Executor.html) – jhamon
FutureTask не поддерживает обновление прогресса – Hesk
Можете ли вы прояснить «приложение, отличное от JavaFX»? – jhamon