我在关闭应用程序时遇到问题,因为关闭应用程序后某些线程仍在运行.有人可以帮我一些方法来阻止所有线程在后台执行之前杀死主线程???
[EDITED]
关于javafx的问题,我注意到许多新开发人员正面临着管理Threads的问题.我想分享一下我为简化在javafx上管理线程的生活所做的工作.我已经基于Android的AsyncTask创建了一个AsyncTask类,它基本上以简单但有效的方式执行Android的相同操作.您可以在Github项目中找到有关它的更多信息
Sea*_*man 33
这里有三个选项 - 最简单的方法是简单地创建Threads作为deamons,这意味着当你的主程序结束时,所有deamon线程也会终止.
Thread thread = new Thread();
thread.setDaemon(true);
Run Code Online (Sandbox Code Playgroud)
这是最简单的,但缺点是你不会得到一个优雅的关闭(即线程将停止,你不会有机会执行资源管理等,这可能或可能不是你的问题).
替代方法是保持生成的线程,当程序收到关闭信号时,迭代线程并传入某种信号以表示它们也应该终止
volatile boolean shutdown = false;
public void shutdown() {
shutdown = true;
}
public void run() {
while(!shutdown) {
... do your work here
}
... perform any cleanup work here
Run Code Online (Sandbox Code Playgroud)
(注意:为了清晰起见,忽略任何异常处理)
最后一个选项是在java.util.concurrent中使用Executor框架
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();
Run Code Online (Sandbox Code Playgroud)
Mir*_*mas 31
更好的解决方法是在关闭请求上添加EventHandler:
@Override
public void start(Stage primaryStage) {
primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
@Override
public void handle(WindowEvent e) {
Platform.exit();
System.exit(0);
}
});
}
Run Code Online (Sandbox Code Playgroud)
小智 5
覆盖您的应用程序类
//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);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
23483 次 |
最近记录: |