我在关闭我的应用程序时遇到了问题,因为在我关闭应用程序之后,一些线程仍然在运行。有人可以帮助我一些方法,以停止所有线程正在后台执行,然后再杀死主线程?
编辑的
通过我关于javafx的问题,我注意到许多新的开发人员都面临着管理线程的问题。我想分享我为简化在javafx上管理线程的工作所做的工作。我已经创建了一个基于Android的AsyncTask的AsyncTask类,它以一种谦虚而有效的方式基本上做了与Android相同的工作。您可以在Github project上找到有关它的更多信息
发布于 2013-02-15 23:01:05
这里有三个选项-最简单的是简单地创建线程作为守护进程,这意味着当你的主程序结束时,所有的守护线程也将终止。
Thread thread = new Thread();
thread.setDaemon(true);
这是最简单的,但缺点是你不会得到一个优雅的关机(即线程将停止,你将没有机会执行资源管理等,这对你来说可能是问题,也可能不是问题)。
另一种方法是保持对生成的线程的控制,当您的程序接收到关闭的信号时,您可以迭代这些线程,并将某种信号传递给signa,通知它们也应该终止
volatile boolean shutdown = false;
public void shutdown() {
shutdown = true;
}
public void run() {
while(!shutdown) {
... do your work here
}
... perform any cleanup work here
(注意:为清楚起见,忽略任何异常处理)
最后一种选择是使用java.util.concurrent中的执行器框架
ExecutorService executorService = Executors.newFixedThreadPool(10);
... assign/invoke tasks etc
... at some point later your program is told to shutdown
... shutdown in executor too
executorService.shutdown();
executorService.awaitTermination(10, TimeUnit.SECONDS); // wait for 10s in this case
executorService.shutdownNow();
发布于 2013-12-04 19:54:10
解决此问题的更好方法是在Close Request上添加EventHandler
@Override
public void start(Stage primaryStage) {
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent e) {
Platform.exit();
System.exit(0);
}
});
}
发布于 2018-01-15 00:46:21
覆盖您的应用程序类
//System.exit(0) This will close all timers and threads inside the Jar application...
@Override
public void stop() throws Exception {
super.stop(); //To change body of generated methods, choose Tools | Templates.
System.exit(0);
}
https://stackoverflow.com/questions/14897194
复制相似问题