【发布时间】:2016-01-14 03:45:42
【问题描述】:
根据文档,Task#call() 是“在执行任务时调用”。
考虑以下程序:
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.stage.Stage;
public class TestTask extends Application {
Long start;
public void start(Stage stage) {
start = System.currentTimeMillis();
new Thread(new Taskus()).start();
}
public static void main(String[] args) {
launch();
}
class Taskus extends Task<Void> {
public Taskus() {
stateProperty().addListener((obs, oldValue, newValue) -> {
try {
System.out.println(newValue + " at " + (System.currentTimeMillis()-start));
} catch (Exception e) {
e.printStackTrace();
}
});
}
public Void call() throws InterruptedException {
for (int i = 0; i < 10000; i++) {
// Could be a lot longer.
}
System.out.println("Some code already executed." + " at " + (System.currentTimeMillis()-start));
Thread.sleep(3000);
return null;
}
}
}
执行这个程序会给我以下输出:
Some code already executed. after 5 milliseconds
SCHEDULED after 5 milliseconds
RUNNING after 7 milliseconds
SUCCEEDED after 3005 milliseconds
为什么在计划任务之前调用call() 方法?这对我来说毫无意义。在我第一次看到问题的任务中,我的任务在任务进入SCHEDULED 状态前几秒钟执行。如果我想给用户一些关于状态的反馈,而在任务已经执行几秒钟之前什么都没有发生怎么办?
【问题讨论】:
标签: javafx concurrency task scheduled-tasks