gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:33:55 25 4
gpt4 key购买 nike

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

DFF
Lookup
Profile
Everything

Everything 调用所有这些方法 我试图在 Everything 方法上实现线程来调用这些方法,然后在 List 被填充后我将控件转移到另一个 fxml 以使用选项卡 Pane 在 TableView 中显示它。

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 View ,同时进度条将在新的 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();
}

关于multithreading - 为 javaFX 应用程序中的多个任务调用 Platform.runLater,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39588072/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com