我在Java中定义了以下任务和线程:
private class FinderTask extends Task<mytype>{
public FinderTask(){
...
};
@Override
protected mytype call() throws Exception {
mytype t = new mytype();
...
return t;
}
}
启动线程
MainController.FinderTask task = new myClass.FinderTask();
task.runningProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> ov, Boolean wasRunning, Boolean isRunning) {
if (!isRunning) {
System.out.println("task finished");
}
}
});
final Thread thread = new Thread(task , "finder");
thread.setDaemon(true);
thread.start();
如何获取调用函数的返回值?
答案 0 :(得分:3)
你可以使用task.getValue();这将在任务状态转换为SUCCEEDED之前设置;所以它将在监听器的if子句中工作(你需要让你的任务最终完成)。
该值也是一个可观察的属性,因此您也可以
task.valueProperty().addListener(new ChangeListener<Task>() {
@Override
public void changed(ObservableValue<? extends mytype> obs, mytype oldValue, mytype newValue) {
if (newValue != null) {
System.out.println("Result of task "+newValue);
}
}
});
答案 1 :(得分:0)
答案 2 :(得分:0)
您可以使call
FinderTask
方法记录在本地实例变量中返回所需的信息 - 为该变量添加getter将使结果可访问。
或者,您可以创建Queue
并将其传递给构建时的FinderTask
。调用call
方法时,只需将结果推入队列即可。然后,您可以保持队列的另一端并监听结果。如果你使用BlockingQueue
非常有效,因为你可以使用一个阻塞的listen方法,直到结果可用。