无异常终止Java线程
我有一个Java程序,我需要杀死一个线程。 它不需要优雅地终止,我只需要线程结束,因为我调用它来终止一堆线程,作为窗口关闭时JavaFX的操作处理程序 以下是正在讨论的计划: 基本上,该程序实现了一系列排序算法,允许用户选择一个,然后选择块大小。 程序将排序拆分为用户输入大小的块,然后在单独的线程上同时对所有这些块进行排序 但是,关闭窗口会使线程在后台保持排序。我需要能够使所有这些操作在窗口关闭时停止(或按下kill按钮或任何情况)无异常终止Java线程,java,multithreading,sorting,javafx,Java,Multithreading,Sorting,Javafx,我有一个Java程序,我需要杀死一个线程。 它不需要优雅地终止,我只需要线程结束,因为我调用它来终止一堆线程,作为窗口关闭时JavaFX的操作处理程序 以下是正在讨论的计划: 基本上,该程序实现了一系列排序算法,允许用户选择一个,然后选择块大小。 程序将排序拆分为用户输入大小的块,然后在单独的线程上同时对所有这些块进行排序 但是,关闭窗口会使线程在后台保持排序。我需要能够使所有这些操作在窗口关闭时停止(或按下kill按钮或任何情况) 我不担心数据的安全性,也不担心是否出现空指针等。我只希望程序真
我不担心数据的安全性,也不担心是否出现空指针等。我只希望程序真正退出。关于
System.exit(myExitCode)的问题如何代码>
但一个更干净的解决方案是使您的排序算法可取消。例如,见
同样有用的是。如果您使用Executors
创建ExecutorService
和submit()
您的可调用的任务,则可以使用myExecutorService.shutdownow()停止所有任务线程。
如果您想更好地控制线程,请查看CompletableFuture.supplySync()
直接杀死线程是不安全的
推荐的方法是使用一个标志,它可以通知线程该停止了
若您可以访问和修改代码,就可以在线程类中创建一个名为stop()的方法,这样当您需要终止进程时,就可以调用myClass.stop()
例如:
public class myClass{
private boolean keepAlive = true;
public void run(){
keepAlive = true;
while(keepAlive){
//do work
}
}
public void stop(){
keepAlive = false;
}
}
只需使线程成为守护线程。守护进程线程不阻止JVM退出。这可以简单到
Runnable mySortAlgorithm = ... ;
Thread thread = new Thread(mySortAlgorithm);
thread.setDaemon(true);
thread.start();
如果您使用执行器来管理线程,即
Executor exec = ... ;
//...
Runnable mySortAlgorithm = ... ;
exec.execute(mySortAlgorithm);
例如,您可以创建一个创建守护进程线程的执行器
Executor exec = Executors.newCachedThreadPool(runnable -> {
Thread t = new Thread(runnable);
t.setDaemon(true);
return t ;
});
//...
Runnable mySortAlgorithm = ... ;
exec.execute(mySortAlgorithm);
您是否可以让线程处理中断并干净地关闭,这应该会减少对测试的影响?一种方法是使用常规线程,而不是使用常规线程。这并不能保证有效,假设其目的是从执行run()
的线程以外的线程调用stop()
。您需要将keepAlive
标记为volatile
,或者同步访问它,或者使用AtomicBoolean
。请注意,即使调用shutdownNow()
也需要运行的线程尊重中断请求(对于排序算法,这通常要求它们定期轮询其中断状态)。