获取线程的返回值

时间:2013-12-02 11:19:26

标签: java multithreading javafx-2 javafx task

我在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();

如何获取调用函数的返回值?

3 个答案:

答案 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)

如果你像这样运行它,即一个普通线程,请参阅get()ref)继承的FutureTask方法。使用Service类(ref)可能更合适,如here所述或Java的标准并发(例如执行程序)。

答案 2 :(得分:0)

您可以使call FinderTask方法记录在本地实例变量中返回所需的信息 - 为该变量添加getter将使结果可访问。

或者,您可以创建Queue并将其传递给构建时的FinderTask。调用call方法时,只需将结果推入队列即可。然后,您可以保持队列的另一端并监听结果。如果你使用BlockingQueue非常有效,因为你可以使用一个阻塞的listen方法,直到结果可用。