繁体   English   中英

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

[英]Why is my scheduled method called twice in a JavaFX 2.2 Service

请参见以下示例:

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应用程序线程-Scheduled()称为
线程4-call()被调用
JavaFX应用程序线程-Scheduled()称为
状态:RUNNING
JavaFX应用程序线程-running()称为
状态:成功
JavaFX应用程序线程-成功调用了()

请注意,此行出现两次:

JavaFX应用程序线程-Scheduled()称为

这意味着“ scheduled()”方法被调用两次。 我希望该方法仅被调用一次。 我做错什么了吗,这是bug,我会误解API吗?

谢谢!

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

来自此Concurency JavaFX

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM