在关闭我的JavaFX程序之前停止线程

我在关闭应用程序时遇到问题,因为在关闭应用程序后,某些线程仍在运行。 有人可以帮我一些方法来阻止所有线程在后台执行,然后杀死主线程???

[EDITED]

关于javafx的问题,我注意到许多新开发人员面临着管理Threads的问题。 我想分享一下我为简化在javafx上管理线程的生活所做的工作。 我已经创建了一个基于Android的AsyncTask的AsyncTask类,它基本上以简单但有效的方式执行Android的相同操作。 您可以在Github项目中找到有关它的更多信息

这里有三个选项 – 最简单的方法是简单地创建Threads作为deamons,这意味着当你的主程序结束时,所有deamon线程也会终止。

Thread thread = new Thread(); thread.setDaemon(true); 

这是最简单的,但缺点是你不会得到一个优雅的关闭(即线程将停止,你不会有机会执行资源管理等,这可能或可能不是你的问题)。

替代方法是保持生成的线程,当程序收到关闭的信号时,迭代线程并传入某种信号以表示它们也应该终止

 volatile boolean shutdown = false; public void shutdown() { shutdown = true; } public void run() { while(!shutdown) { ... do your work here } ... perform any cleanup work here 

(注意:为清晰起见,忽略任何exception处理)

最后一个选项是在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(); 

更好的解决方法是在关闭请求上添加EventHandler

 @Override public void start(Stage primaryStage) { primaryStage.setOnCloseRequest(new EventHandler() { @Override public void handle(WindowEvent e) { Platform.exit(); System.exit(0); } }); } 

来自java.util.concurrent包的执行程序是java.util.concurrent的方法。 明确:

 ExecutorService executorService = Executors.newCachedThreadPool(new ThreadFactory() { @Override public Thread newThread(Runnable runnable) { Thread thread = Executors.defaultThreadFactory().newThread(runnable); thread.setDaemon(true); return thread; } }); 

带有固定ScheduledExecutorService的 Java 8版本

 ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1, r -> { Thread thread = Executors.defaultThreadFactory().newThread(r); thread.setDaemon(true); return thread; }); 

覆盖您的应用程序类

 //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); }