如何在 运行 时中断或终止 java 线程

How to interrupt or kill a java thread while it's running

阅读了几篇关于如何终止 Java 线程的 SO 帖子后,我相当理解为什么停止 不安全 以及如何处理正常停止。

但解决方案针对的是 UI 线程,其中重绘是问题所在,并不是很长 运行 - 线程执行的阻塞进程。

链接:

How do you kill a Thread in Java? https://docs.oracle.com/javase/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html

我无法从解决方案或示例中理解的一个精确点是样本试图模拟的长 运行 部分是什么。

例如:在下面的代码中,如果我将间隔设置为 INT.MAX。

public void run() {
        Thread thisThread = Thread.currentThread();
        while (blinker == thisThread) {
            try {
                thisThread.sleep(interval);  // This might take forever to complete, 
                                             // and while may never be executed 2nd time.

                synchronized(this) {
                    while (threadSuspended && blinker==thisThread)
                        wait();
                }
            } catch (InterruptedException e){
            }
            repaint();
        }
    }

    public synchronized void stop() {
        blinker = null;
        notify();
    }

我问这个用例的原因是,我在遗留代码库中有一个错误,它在线程中运行另一个可执行文件。 现在询问用户是否希望停止线程,我们需要终止该线程,并且作为该线程一部分的可执行文件会自动被终止。

停止线程的方法是要求它——很好地——停止。这取决于线程 运行 侦听并根据该请求采取行动的代码。

具体的做法是打断线程。您的代码检查中断 - 如果线程在执行之前或期间被中断,Thread.sleepObject.wait 将抛出 InterruptedException;但是你抓住了中断,并忽略了它,所以你不会对它采取行动。

而不是这个:

while (condition) {
  try {
    Thread.sleep(...);

    wait();
  } catch (InterruptedException e) {
  }
}

将中断放在循环外:

try {
  while (condition) {
    Thread.sleep(...);
    wait();
  }
} catch (InterruptedException e) {
}

然后循环如果被中断就终止。