2014-03-07 7 views
0

請看下面的例子叫了兩聲安排方法:爲什麼我在一個JavaFX 2.2服務

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應用程序線程 - 計劃()調用
線程4 - 調用()調用
JavaFX Application Thread - scheduled() )稱爲
狀態:運行
的JavaFX應用程序線程 - 運行()稱爲
國家:繼任
的JavaFX應用程序線程 - 成功()稱爲

注意,此行中出現了兩次:

JavaFX Application Thread - scheduled()called

這意味着「scheduled()」方法被調用兩次。 我會期待該方法只被調用一次。 我做錯了什麼,這是錯誤,我誤解了API?

謝謝!

回答

0

Worker對象的生命週期定義如下。創建時,Worker對象處於READY狀態。在安排工作時,Worker對象轉換到SCHEDULED狀態。之後,當Worker對象執行工作時,其狀態變爲RUNNING。 請注意,即使當Worker對象立即啓動而未被調度時,它也會首先轉換到SCHEDULED狀態,然後轉換到RUNNING狀態。

從這個Concurency JavaFX

+0

嗨!謝謝你試圖回答這個問題,但你的回答並不回答這個問題。我的問題不是爲什麼工人/服務總是處於預定狀態。它是:爲什麼scheduled()方法在一個生命週期中被調用**兩次**(緊接在一起)。 – cranphin

+0

嗨!當創建服務對象時,狀態爲READY,然後立即進入SCHEDULED狀態(因此您將打印前4行)。然後稍後調用調度程序時,應用程序將運行,並且任務狀態將設置爲SCHEDULED(最後狀態),然後調用...(由此您將打印其餘行)。希望這有幫助! – Edwin

相關問題