【问题标题】:Terminating Java thread without exceptions无异常终止 Java 线程
【发布时间】:2018-03-13 13:39:49
【问题描述】:

我有一个需要终止线程的 Java 程序。 它不需要被优雅地杀死,我只需要结束线程,因为我调用它来杀死一堆线程作为关闭窗口时 JavaFX 的操作处理程序。

这里是有问题的程序:https://github.com/Aashishkebab/Sorting-Simulator

基本上,该程序实现了一堆排序算法,并允许用户选择一个,然后选择一个块大小。 该程序将排序拆分为用户输入大小的块,然后在单独的线程上同时对所有这些进行排序。

但是,关闭窗口会导致线程在后台继续排序。我需要能够使所有这些操作在窗口关闭时停止(或按下终止按钮或其他任何情况)。

我不担心数据的安全性,或者是否出现空指针等问题,我只是希望程序真正退出。

【问题讨论】:

  • 你能让线程处理中断,干净地关闭,这样可以减少对测试的影响吗?
  • 一种方法是使用daemon threads 而不是常规线程。

标签: java multithreading sorting javafx


【解决方案1】:

只需创建线程守护线程即可。守护线程是不阻止 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);

【讨论】:

    【解决方案2】:

    如果您使用Executors 来创建ExecutorServicesubmit() 您的Callable 任务,则可以使用myExecutorService.shutdownNow() 停止所有任务线程

    如果您想更好地控制线程,请查看CompletableFuture.supplyAsync()

    【讨论】:

    • 请注意,即使是对 shutdownNow() 的调用也要求正在运行的线程尊重中断请求(对于排序算法,这通常需要它们定期轮询其中断状态)。
    【解决方案3】:

    System.exit(myExitCode); 呢。

    但更简洁的解决方案是让您的排序算法可取消。例如,请参阅here

    this 也很有用。

    【讨论】:

      【解决方案4】:

      直接杀死线程是不安全的。

      推荐的方法是使用一个可以通知线程该停止的标志。

      如果你可以访问和修改代码,你可以在你的线程类中创建一个名为 stop() 的方法,这样当你需要终止进程时,你可以调用 myClass.stop()。

      例如:

      public class myClass{
      
        private boolean keepAlive = true;
      
        public void run(){
      
           keepAlive = true;
           while(keepAlive){
             //do work
           }
        }
      
        public void stop(){
          keepAlive = false;
        }
      }
      

      【讨论】:

      • 这不能保证工作,假设意图是从一个线程调用stop() 而不是run() 正在执行的线程。您要么需要将keepAlive 标记为volatile,要么需要synchronize 访问它,或者使用AtomicBoolean
      猜你喜欢
      • 2014-11-18
      • 2012-08-28
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 2011-10-03
      • 2010-12-23
      • 2015-12-21
      • 2011-08-11
      相关资源
      最近更新 更多