首页 文章

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

提问于
浏览
3

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

DFF
Lookup
Profile
Everything

Everything 呼吁 Everything 方法来调用这些方法所有的这些方法我想实现线程再经过 List s的popuplated我的控制转移到另一个FXML使用标签窗格表视图中显示它 .

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线程请帮忙

1 回答

  • 3

    您只需在任务中添加 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();
    }
    

相关问题