我正在编写一个 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 控制器示例如下所示(稍微抽象一下):
ExecutorService threadPool = Executors.newFixedThreadPool(2);
private void handleStartButtonAction(ActionEvent event) {
MyTask task = new MyTask();
threadPool.execute(task);
}
目前我的任务只是休眠并打印数字 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() ,这似乎解决了问题,尽管我知道这不是正确的方法。
有人可以建议我在终止子线程方面需要做什么,以及可接受的方法是什么?即,检查它们是否完整,然后终止。
Thanks
The Javadocs http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Executors.html#newFixedThreadPool%28int%29 for Executors.newFixedThreadPool()
声明:
池中的线程将一直存在,直到显式关闭为止。
另请检查用法示例 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html of ExecutorService
,他们总是注意关闭游泳池。
您可能必须确保threadPool.shutdown()
在应用程序的适当位置调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)