gpt4 book ai didi

multithreading - JavaFX 任务线程未终止

转载 作者:行者123 更新时间:2023-12-04 18:07:49 24 4
gpt4 key购买 nike

我正在编写一个 JavaFX 应用程序,并且我的对象扩展了 Task 以提供远离 JavaFX GUI 线程的并发性。

我的主类看起来像这样:

public class MainApp extends Application {

@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("Sample.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
public void handle(WindowEvent t) {
//I have put this in to solve the threading problem for now.
Platform.exit();
System.exit(0);
}
});
stage.show();
}

public static void main(String[] args) {
launch(args);
}
}

我的 GUI Controller 示例如下所示(稍微抽象):
ExecutorService threadPool = Executors.newFixedThreadPool(2);
private void handleStartButtonAction(ActionEvent event) {
MyTask task = new MyTask();
threadPool.execute(task);
}

目前我的任务只是 sleep 并打印数字 1 到 10:
public class MyTask extends Task<String> {

@Override
protected String call() throws Exception {
updateProgress(0.1, 10);
for (int i=0;i<=10;i++) {
if (isCancelled()) {
break;
}
Thread.sleep(1000);
System.out.println(i);
updateProgress(i, 10);
}
return "Complete";
}
}

我遇到的问题是,一旦任务完成,它看起来好像启动任务的线程继续运行。因此,当我按右上角的“X”退出 JavaFX 应用程序时,JVM 继续运行并且我的应用程序不会终止。如果你看看我的主类,我已经放入了 System.exit() ,这似乎解决了问题,尽管我知道这不是正确的方法。

有人可以建议我在终止子线程方面需要做什么,以及这样做的可接受方式是什么?例如,检查它们是否完整然后终止。

谢谢

最佳答案

JavadocsExecutors.newFixedThreadPool()声明:

The threads in the pool will exist until it is explicitly shutdown.



还要检查 usage examplesExecutorService ,他们注意始终关闭池。

您可能必须确保 threadPool.shutdown()在应用程序的适当位置调用。

关于multithreading - JavaFX 任务线程未终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22657192/

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