【问题标题】:How do I kill a thread from another thread in Java?如何从 Java 中的另一个线程中杀死一个线程?
【发布时间】:2010-12-13 10:11:25
【问题描述】:

我正在从一个主线程调用两个线程,分别称为线程 1 和线程 2。当线程 1 停止时,我也想停止或终止线程 2。我该怎么做?我想要的实际输出发生了变化。那就是有一个主类也是线程。从主类我调用线程1和线程2。我从主类给线程1输入但是当此输入发生更改时,我想终止正在运行的线程 1 并使用另一个输入再次启动它。第二个线程,线程 2 将使用线程 1 给出的输出运行。所以最终当第一个线程被杀死时,第二个线程将运行但仅当 t6here 是该线程的输入时才会给出输出。

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

    Java 已弃用用于显式终止另一个线程的方法(如 Thread.stop / Thread.destroy)。正确的方法是确保其他线程上的操作可以处理被告知停止的情况(例如,他们期望一个 InterruptedException,这意味着您可以调用 Thread.interrupt() 来停止它)。

    您可能还对将第二个线程设置为daemon thread 感兴趣,这意味着如果 VM 中的所有其他线程都已完成,则该进程将退出。

    【讨论】:

      【解决方案2】:

      请参阅this Java Specialist article,了解如何干净地关闭线程。

      简单来说,文章推荐Thread.interrupt()加上适当的InterruptedException在线程代码中处理。这本身就是一个有趣的讨论,而且我很少看到做得正确。

      【讨论】:

      • 这篇文章很值得一读,推荐给没有足够时间阅读 Doug Lea 的 Java 并发编程的任何人
      【解决方案3】:

      根据these instructions,最好使用标志变量来告诉另一个线程干净地停止它的工作。

      【讨论】:

      • 非常感谢您的建议,但您可以帮助我正确指定它。
      【解决方案4】:

      在您的线程的run() 方法中,当您想停止线程时,检查通过shutdown() 等访问器方法设置的属性,使用该值结束while 循环。例如:

      boolean stopping = false;
      
      Thread currentThread = null;
      
      public void run() {
      
          currentThread = Thread.currentThread();
      
          while (!isStopping()) {
      
              // do something, sleep a while
          }
      }
      
      public synchronized void shutdown() {
      
          stopping = true;
      
          currentThread.notifyAll();
      }
      
      public synchronized boolean isStopping() {
      
          return stopping;
      }
      

      【讨论】:

      • 您的代码存在竞争条件,并且您对同步的使用很差。最好简单地检查当前线程的中断状态,或者如果你必须使用某种哨兵,至少让它成为原子的。
      • @Kevin,你一定错过了 For example 位,这段代码显然只是为了显示解决方案的结构 - 不能按原样使用。
      • @rsp:如果您发布示例,最好让它们成为好示例。如果人们已经知道区分好坏的例子,他们就不必在这里问了。
      猜你喜欢
      • 2011-05-30
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多