簡體   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