首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Java中停止线程?

如何在Java中停止线程?
EN

Stack Overflow用户
提问于 2009-10-23 07:27:09
回答 3查看 4.9K关注 0票数 2

我用GUI制作了一个java程序,我想要一个停止按钮功能,当用户点击停止按钮时,程序必须停止。

在我的程序中,主线程启动其他10个线程,我希望每当单击“停止”按钮时,必须在主thread.

  • Second,之前停止所有10个线程,我还希望每当停止这10个线程的任何线程时,它必须首先关闭它打开的所有资源,例如连接到数据库等。

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

现在有一个问题。

我的线程类如下:

代码语言:javascript
复制
public class ParserThread implements Runnable {
    private volatile boolean stopped = false;

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

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

代码语言:javascript
复制
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方法来设置“stop = true”来停止线程。我希望这件事对所有10个线程都能完成。

我怎么能叫那个停止方法。我希望它在主类的stopAllThreads()方法中完成。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-10-23 07:29:50

一般来说,这样做的方法是让其他每个线程定期检查一个标志。通常情况下,后台线程循环,等待工作-他们只需要检查标志,每次他们转一圈。如果他们使用Object.wait()或类似的东西被告知还有更多的工作,那么应该使用相同的通知来指示线程也应该停止。(不要只旋转直到你停下来-那会吸掉CPU。)不要只使用睡眠--这会延迟终止。)

它允许所有线程干净地终止,并适当地释放资源。其他选项,如interrupt()和被废弃的destroy()方法,要正确控制要困难得多。(中断线程要比硬中断好,但它有自己的一组问题--比如中断只在特定的点进行处理。)

编辑:在代码中,它看起来类似于:

代码语言:javascript
复制
// 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()方法也通知监视器,则需要使其稍微复杂一些,但这是基本的想法。

样本任务:

代码语言:javascript
复制
public class SomeTask extends Task {
  public void run() {
    while (!shouldStop()) {
      // Do work
    }
  }
}
票数 8
EN

Stack Overflow用户

发布于 2015-05-27 04:44:06

我认为答案解决不了这个问题。在这里,代码:

代码语言:javascript
复制
public class SomeTask extends Task {
   public void run() {
      while (!shouldStop()) {
        // Do work
      }
    }
  }

但是如何处理如果“做工作”挂而不回来呢?在这种情况下,时间不能检查标志。线程仍然无法停止。

解决这个问题的可能方法可能是使用过程。

票数 0
EN

Stack Overflow用户

发布于 2011-05-14 18:16:43

有一个控制器对象,该对象具有一个标志,即线程是否应该停止,每个线程定期检查控制器,如果单击stop按钮,则退出(例如,如果您正在传输文件,则在接收/发送每个块之后,检查是否单击stop )。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1611862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档