当前位置: 首页 > 面试题库 >

如何在Java中停止线程?

董和泽
2023-03-14
问题内容

我已经用GUI制作了一个Java程序,并且想要一个停止按钮功能,其中当用户单击停止按钮时,必须停止该程序。

  1. 在我的程序中,主线程启动其他10个线程,我希望每当单击“停止”按钮时,所有10个线程都必须在主线程之前停止。

  2. 其次,我还希望每当停止这10个线程中的任何一个线程时,它都必须先关闭它打开的所有资源,然后再连接数据库等。

我已经实现了.......回答的代码

现在有一个问题。

我的线程类是这样的:

public class ParserThread implements Runnable {
    private volatile boolean stopped = false;

    public void stopTheThread() {
        stopped = true;
    }
    :
    :
}

下面是从函数start()启动10个线程的主线程

public class Main() {
    Thread [] threads;

    public void start() {
        for(int i = 0; i < 10; i++) {
            threads[i] = new Thread(new ParserThread());
        }       
    }

    public void stop() {
        // code to stop all the threads
    }
}

现在,我想调用ParserThread的stop方法来设置“ stopped = true”以停止线程。我希望对所有10个线程都执行此操作。

如何调用该stop方法。我希望在Main类的stopAllThreads()方法中完成此操作。


问题答案:

一般而言,执行此操作的方法是让每个其他线程定期检查标志。后台线程经常循环,等待工作-
每次循环时,它们只需要检查标志即可。如果他们正在使用Object.wait()或类似的东西被告知还有更多工作要做,则应使用相同的通知来指示线程也应停止。(不要只是旋转,直到您停止-
这会占用CPU。不要只是使用sleep-这会延迟终止。)

这样一来,所有线程便可以干净地终止,从而适当地释放资源。IMO
interrupt()和其他选项(例如和不赞成使用的destroy()方法)很难进行正确控制。(中断线程比硬终止线程更好,但是线程有其自身的一系列问题-
例如,无论如何,仅在某些点处理中断。)

编辑:在代码中,它将类似于:

// Client code
for (Task task : tasks) {
  task.stop();
}

// Threading code
public abstract class Task implements Runnable {

  private volatile boolean stopped = false;

  public void stop() {
    stopped = true;
  }

  protected boolean shouldStop() {
    return stopped;
  }

  public abstract void run();
}

然后,您的任务将成为子类Task。如果您希望该stop()方法还可以通知监视器,则需要使其稍微复杂一些,但这是基本思想。

示例任务:

public class SomeTask extends Task {
  public void run() {
    while (!shouldStop()) {
      // Do work
    }
  }
}


 类似资料:
  • 问题内容: 我正在尝试停止线程,但是我不能这样做: 因此,即使我调用方法“停止”,线程也不会停止。它一直活着。 如何中断/停止该线程? 更新 (@little方法) 中间件类: 但是,当我尝试停止线程时,它没有。 上面的代码有什么问题? 问题答案: 确实没有必要使用标志。相反,只需使用来查询线程的状态。另外,为什么还要将线程对象包装在另一个线程对象中?对我来说,这似乎完全没有必要。 这是你应该做的

  • 问题内容: 如果我有这样的Java代码: 并在调试中运行它,我可以看到所有这些线程(在取消之后)仍在运行,所以它们也占用了我的内存吗?如果是的话,我怎么能完全销毁那些线程? 问题答案: 调用您的线程,仅此而已。因此,您需要在您的方法中正确处理它。对于您的简单情况,您的线程将完成其执行,并且它们的对象将由GC清除。

  • 问题内容: 我有一个Java应用程序, 我不能编辑 启动一个具有此方法: 我想在某个时间点停止它。如果我使用它不起作用。如果我使用它,则可以使用,但是不建议使用此方法(因此不建议使用该方法,因为在新版本中可能会将其从JVM中删除)。 如何在Java中停止此类不间断线程? 问题答案: 您可以使用检查变量来实现中断方法。 首先,使用易失性检查变量作为: 接下来,将您的线程定义为依赖于此变量。 接下来定

  • 问题内容: 我需要一个解决方案来正确停止Java中的线程。 我有实现Runnable接口的类: 我有启动和停止线程的类: 但是当我关闭时,我在类中得到了异常: 我正在使用JDK 1.6。所以问题是: 如何停止线程并且不引发任何异常? PS我不想使用;方法,因为它已过时。 问题答案: 在类中,你需要一种设置标志的方法,该标志通知线程它将需要终止,类似于你刚刚在类范围中使用的变量。 当你希望停止线程时

  • 问题内容: 我正在编写一段连接到服务器的代码,使用该连接会生成一堆线程并执行一堆“工作”。 在某些情况下,连接失败,我需要停止所有操作并从头开始创建新对象。 我想在对象之后进行清理,但在线程上调用thread.stop,但是此方法似乎已被弃用。 推荐的替代方法是什么?是否应该为每个线程编写自己的清理和退出方法?将线程设置为null?或者是其他东西? 问题答案: 看这里 : 在HowToStopAT

  • 问题内容: 我写了一个线程,它花费太多时间执行,而且似乎还没有完全完成。我想优雅地停止线程。有什么帮助吗? 问题答案: 做到这一点的好方法是让一个线程保护一个Thread的变量,并在你要停止它的时候将其设置为外部变量,例如: `class MyThread extends Thread { volatile boolean finished = false; public void stopMe(