Java 执行器或线程阻止程序关闭
在我的程序中,创建了一些线程,并给它们分配了一个结束的Java 执行器或线程阻止程序关闭,java,multithreading,javafx,javafx-8,Java,Multithreading,Javafx,Javafx 8,在我的程序中,创建了一些线程,并给它们分配了一个结束的任务(这样线程就会死亡),我还有一个执行器.newSingleThreadScheduledExecutor和执行器.newSingleThreadExecutor,我注意到,如果我按下我所做的关闭按钮: @FXML private void handleExit(){ gameManager.cleanup(); Stage stage = (Stage)menuBarTopMenu.getScene().getWindow
任务
(这样线程就会死亡),我还有一个执行器.newSingleThreadScheduledExecutor
和执行器.newSingleThreadExecutor
,我注意到,如果我按下我所做的关闭按钮:
@FXML private void handleExit(){
gameManager.cleanup();
Stage stage = (Stage)menuBarTopMenu.getScene().getWindow();
Platform.exit();
stage.close();
}
我没有在intelij中使用退出代码0完成过程
因此,我甚至将我提到的那些线程设置为守护进程,这就是清理:
public void cleanup(){
updateTime.shutdown(); // it's Executors.newSingleThreadScheduledExecutor
updateTime.shutdownNow();
}
但我仍然没有看到成功的退出。可能是因为我没有关闭执行器。newSingleThreadExecutor
?我找不到关闭它的方法
我还应该做什么清理呢?是的,这正是因为你没有在newSingleThreadExecutor上调用shutdown,但是如果你有其他正在运行的线程,它们也可能会阻止应用程序退出。要强制VM关闭(所有线程都将被终止),您可以调用
System.exit(0)代码>
您将Executor服务装箱为:
ExecutorService service = Executors.newSingleThreadScheduledExecutor();
\\ use the service to do work
\\ to shutdown the service
service.shutdown();
\\ to wait till the service terminate
service.awaitTermination();
好的,它没有一个shutdown
方法,那么如何关闭它呢?我在另一个答案中读到System.exit(0)代码>并没有真正关闭程序…您从执行器获得的服务有一个关闭方法,但我不使用服务,我使用:private Executor XExecutor=Executors.newSingleThreadExecutor()代码>并且它不想执行ScheduledExecutorService service=XExecutor代码>对不起,它应该是:privateScheduledExecutorService XExecutor=Executors。newSingleThreadScheduledExecutor()代码>在您尝试退出并查看仍在运行的内容后,检查线程转储(或使用visualvm等工具)的可能重复项。@NicolasFilotto我不能关闭的不是服务,而是newSingleThreadExecutor
。这是一样的,这只是重复应答中的一个特定用例。我会做一个线程转储,以找出哪些非deamon线程实际上仍在运行