Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 执行器或线程阻止程序关闭_Java_Multithreading_Javafx_Javafx 8 - Fatal编程技术网

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对不起,它应该是:private
ScheduledExecutorService XExecutor=Executors。newSingleThreadScheduledExecutor()在您尝试退出并查看仍在运行的内容后,检查线程转储(或使用visualvm等工具)的可能重复项。@NicolasFilotto我不能关闭的不是服务,而是
newSingleThreadExecutor
。这是一样的,这只是重复应答中的一个特定用例。我会做一个线程转储,以找出哪些非deamon线程实际上仍在运行