2016-09-20 6 views
3

で複数のタスクのためにPlatform.runLaterを呼び出すと、私はそれに接続されているいくつかの方法があり、すべてのこれらのメソッドを呼び出します JavaFXアプリケーション

DFF 
Lookup 
Profile 
Everything 

よう

Everythingすべてのメソッドを呼び出し、すべてのもののような一つの方法があるJavaFXアプリケーションを持っています私はこれらのメソッドを呼び出すEverythingメソッドのスレッディングを実装しようとしていて、Listがpopuplatedされた後、タブペインを使用してテーブルビューで表示するために別のfxmlにコントロールを転送します。

​​

私はFXMLビューをロードし、手段になるように新しいFXMLとUIのプログレスバーがループが遅れていないだろうしながら、すべてのスレッドが実行を終了した後、1回のみPlatform.runLaterメソッドを呼び出す必要があります。 が、私はそこに、スレッド同期エラーであると私はそれについて知らない最後のタスク内に配置した場合、私のPlatform.runLaterコード

Platform.runLater(new Runnable() { 
    @Override public void run() { 
     try { 
      Parent parent = FXMLLoader.load(getClass().getResource("AolRun.fxml")); 
      SmartCC.fxmlval.add("AOLScreen.fxml"); 
      SmartCC.stageval.add((Stage) run.getScene().getWindow()); 
      Stage stage = new Stage(); 
      stage.initStyle(StageStyle.UTILITY); 
      stage = (Stage) run.getScene().getWindow(); 
      Scene scene = new Scene(parent); 
      stage.setScene(scene); 
      scene.getStylesheets().add("/css/Style.css"); 
      stage.setTitle("AOL Output "); 
      stage.setResizable(false); 
      stage.show(); 
     } catch (IOException ex) { 
      Logger.getLogger(AOLScreenController.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
}); 

を配置する場所を知りません。
スレッドとjavafxスレッドにはとても新しいです。

答えて

3

ハンドラをタスクに追加することができます。このハンドラは、タスクが正常に完了した後にアプリケーションスレッドで実行されます。

public void runEverything() { 
    ... 

    EventHandler<WorkerStateEvent> handler = new EventHandler<WorkerStateEvent>() { 
     private int remainingTasks = tasks.size(); 

     @Override 
     public void handle(WorkerStateEvent event) { 
       if ((--remainingTasks) == 0) { 
        try { 
         Parent parent = FXMLLoader.load(getClass().getResource("AolRun.fxml")); 
         SmartCC.fxmlval.add("AOLScreen.fxml"); 
         SmartCC.stageval.add((Stage) run.getScne().getWindow()); 
         Stage stage = new Stage(); 
         stage.initStyle(StageStyle.UTILITY); 
         stage = (Stage) run.getScene().getWindow(); 
         Scene scene = new Scene(parent); 
         stage.setScene(scene); 
         scene.getStylesheets().add("/css/Style.css"); 
         stage.setTitle("AOL Output "); 
         stage.setResizable(false); 
         stage.show(); 
        } catch (IOException ex) { 
         Logger.getLogger(AOLScreenController.class.getName()).log(Level.SEVERE, null, ex); 
        } 
       } 
     } 

    }; 

    ExecutorService threadPool = Executors.newFixedThreadPool(5); 
    for (Task t : tasks) { 
     t.setOnSuceeded(handler); 
     threadPool.submit(t); 
    } 
    threadPool.shutdown(); 
} 
+0

このファビアンにお伺いして申し訳ありませんが、これらのタスクのそれぞれで成功ハンドラメソッドを追加する必要があります。ここでplatform.runlaterメソッドを使用する –

+0

@RahulSingh 'Task'は' onSuceeded'ハンドラコードがJavaFXアプリケーションスレッド上で実行されることを確認します。これは 'Platform.runLater'を使用して達成したものです。さらに、すべてのタスクにこれを追加して、最後のタスクがいつ終了するかを知る必要があります(AFAIKこれはステージ作成のコードを呼び出すときです)。 – fabian

+0

ありがとうございますが、ここで問題となるのは1つの問題ですが、10回中9回は動作しますが、時には印刷時にタスクが滞っていて前進するようなときにスレッド同期の問題が発生することがあります。 –

関連する問題