在非JavaFX应用程序中,我希望拥有与Task相同的类。
执行某些操作并能够返回其进度的线程。
是否有可以执行与上述类似的任务?
答案 0 :(得分:2)
Task
类为FutureTask
添加了许多功能,但所有非显而易见的部分都与提供 observable 属性并确保它们更新有关在FX应用程序线程上。听起来你不需要任何困难的部分:你正在查询任务以检查它的进度(所以你不需要可观察性,即当进度改变时调用回调)并且你没有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 ;
}
}