为 javaFX 应用程序中的多个任务调用 Platform.runLater

Calling Platform.runLater for multiple tasks in javaFX application

我有一个 JavaFX 应用程序,它附加了几个方法,并且有一个方法与调用所有方法的所有方法一样 喜欢

DFF
Lookup
Profile
Everything

Everything 调用所有这些方法我试图在 Everything 方法上实现线程来调用这些方法然后在 Lists 被填充后我将控制转移到另一个 fxml使用选项卡窗格在 table 视图中显示它。

public void runEverything(){
    List<Task> tasks = new ArrayList();

    Task task = new Task() {
        protected Object call() throws Exception {                
            dataAOL = aol.getAolReport(InstanceController.validateto, InstanceController.validatefrom, pattern.getText());
            System.out.println("Method"+AOLScreenController.dataAOL.size());             

            return null;
        } 

    };
    Task task1 = new Task() {
        protected Object call() throws Exception {                
            dataProfile = aol.getAolReport(InstanceController.validateto, InstanceController.validatefrom, pattern.getText());
            System.out.println("Method"+AOLScreenController.dataAOL.size());                

            return null;
        } 

    };

    tasks.add(task);
    tasks.add(task1);

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

我只需要在所有线程完成执行后调用一次 Platform.runLater 方法,以便我加载 fxml 视图,同时进度条将在新的 fxml 中循环并且 ui 不会滞后。 但我不知道在哪里放置我的 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 线程很陌生,请帮忙

您可以只向任务添加一个 onSucceded 处理程序。成功完成任务后,此处理程序 运行 在应用程序线程上:

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();
}