为什么我的调度方法在JavaFX 2.2服务中调用了两次

时间:2014-03-07 13:27:18

标签: java javafx javafx-2 worker

请参阅以下示例:

public class Test extends Application {
  public static void main(final String[] args) {
    launch(args);
  }

  @Override
  public void start(final Stage primaryStage) {
    primaryStage.setTitle("Hi!");
    primaryStage.setScene(new Scene(new BorderPane()));
    primaryStage.show();

    Service<Void> myService = new Service<Void>() {
      @Override
      protected Task<Void> createTask() {
        return new Task<Void>() {
          @Override
          protected void cancelled() {
            super.cancelled();
            System.out.println(Thread.currentThread().getName() + " - cancelled() called");
          }

          @Override
          protected void failed() {
            super.failed();
            System.out.println(Thread.currentThread().getName() + " - failed() called");
          }

          @Override
          protected void running() {
            super.running();
            System.out.println(Thread.currentThread().getName() + " - running() called");
          }

          @Override
          protected void succeeded() {
            super.succeeded();
            System.out.println(Thread.currentThread().getName() + " - succeeded() called");
          }

          @Override
          protected void scheduled() {
            super.scheduled();
            System.out.println(Thread.currentThread().getName() + " - scheduled() called");
          }

          @Override
          protected Void call() throws Exception {
            System.out.println(Thread.currentThread().getName() + " - call() called");
            return null;
          }
        };
      }
    };
    myService.stateProperty().addListener(new ChangeListener<State>() {
      @Override
      public void changed(ObservableValue<? extends State> arg0, State arg1, State newValue) {
        System.out.println("State: " + newValue);                   
      }
    });
    myService.start();
  }
}

这给出了以下输出:

  

国家:安排了    JavaFX应用程序线程 - 调度()调用
  Thread-4 - call()叫做
   JavaFX应用程序线程 - 调度()调用
  状态:运行中   JavaFX应用程序线程 - running()称为
  国家:成功的   JavaFX应用程序线程 - 成功()调用

请注意,此行会出现两次:

  

JavaFX应用程序线程 - 已调度()

这意味着“scheduled()”方法被调用两次。 我原以为只能调用一次这个方法。 我做错了什么,这是错误,我是否误解了API?

谢谢!

1 个答案:

答案 0 :(得分:0)

  

Worker对象的生命周期定义如下。创建时,Worker对象处于READY状态。在计划工作时,Worker对象转换为SCHEDULED状态。之后,当Worker对象执行工作时,其状态变为RUNNING。 请注意,即使在没有安排的情况下立即启动Worker对象,它也会首先转换为SCHEDULED状态,然后转换为RUNNING状态。

来自Concurency JavaFX