无异常终止Java线程

无异常终止Java线程,java,multithreading,sorting,javafx,Java,Multithreading,Sorting,Javafx,我有一个Java程序,我需要杀死一个线程。 它不需要优雅地终止,我只需要线程结束,因为我调用它来终止一堆线程,作为窗口关闭时JavaFX的操作处理程序 以下是正在讨论的计划: 基本上,该程序实现了一系列排序算法,允许用户选择一个,然后选择块大小。 程序将排序拆分为用户输入大小的块,然后在单独的线程上同时对所有这些块进行排序 但是,关闭窗口会使线程在后台保持排序。我需要能够使所有这些操作在窗口关闭时停止(或按下kill按钮或任何情况) 我不担心数据的安全性,也不担心是否出现空指针等。我只希望程序真

我有一个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()
也需要运行的线程尊重中断请求(对于排序算法,这通常要求它们定期轮询其中断状态)。