如何停止通过实现可运行接口创建的线程?

2022-08-31 13:59:14

我通过实现可运行的接口创建了类,然后在我项目的其他类中创建了许多线程(近10个)。
如何停止其中一些线程?


答案 1

最简单的方法是它,这将导致 返回 ,并且在某些情况下线程正在等待时也可能抛出一个,例如,等。interrupt()Thread.currentThread().isInterrupted()trueInterruptedExceptionThread.sleep()otherThread.join()object.wait()

在方法中,您需要捕获该异常和/或定期检查值并执行某些操作(例如,break out)。run()Thread.currentThread().isInterrupted()

注意:虽然看起来与 相同,但它有一个令人讨厌的副作用:调用清除标志,而调用则不清除标志。Thread.interrupted()isInterrupted()interrupted()interruptedisInterrupted()

其他非中断方法涉及使用正在运行的线程监视的“stop”() 标志。volatile


答案 2

如何停止通过实现可运行接口创建的线程?

您可以通过多种方式停止线程,但所有方法都需要特定的代码来执行此操作。停止线程的典型方法是让线程每隔一段时间检查一次字段:volatile boolean shutdown

  // set this to true to stop the thread
  volatile boolean shutdown = false;
  ...
  public void run() {
      while (!shutdown) {
          // continue processing
      }
  }

您还可以中断导致 、 和一些其他方法抛出 的线程。您还应该使用如下内容测试线程中断标志:sleep()wait()InterruptedException

  public void run() {
      while (!Thread.currentThread().isInterrupted()) {
          // continue processing
          try {
              Thread.sleep(1000);
          } catch (InterruptedException e) {
              // good practice
              Thread.currentThread().interrupt();
              return;
          }
      }
  }

请注意,中断线程并不一定会导致它立即引发异常。只有当您处于可中断的方法中时,才会抛出 。interrupt()InterruptedException

如果你想向你的类中添加一个实现的方法,你应该定义你自己的类,如下所示:shutdown()Runnable

public class MyRunnable implements Runnable {
    private volatile boolean shutdown;
    public void run() {
        while (!shutdown) {
            ...
        }
    }
    public void shutdown() {
        shutdown = true;
    }
}