我用GUI制作了一个java程序,我想要一个停止按钮功能,当用户点击停止按钮时,程序必须停止。
在我的程序中,主线程启动其他10个线程,我希望每当单击“停止”按钮时,必须在主thread.
。
我已经实现了由.回答的代码。
现在有一个问题。
我的线程类如下:
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方法来设置“stop = true”来停止线程。我希望这件事对所有10个线程都能完成。
我怎么能叫那个停止方法。我希望它在主类的stopAllThreads()方法中完成。
发布于 2009-10-23 07:29:50
一般来说,这样做的方法是让其他每个线程定期检查一个标志。通常情况下,后台线程循环,等待工作-他们只需要检查标志,每次他们转一圈。如果他们使用Object.wait()或类似的东西被告知还有更多的工作,那么应该使用相同的通知来指示线程也应该停止。(不要只旋转直到你停下来-那会吸掉CPU。)不要只使用睡眠--这会延迟终止。)
它允许所有线程干净地终止,并适当地释放资源。其他选项,如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
}
}
}发布于 2015-05-27 04:44:06
我认为答案解决不了这个问题。在这里,代码:
public class SomeTask extends Task {
public void run() {
while (!shouldStop()) {
// Do work
}
}
}但是如何处理如果“做工作”挂而不回来呢?在这种情况下,时间不能检查标志。线程仍然无法停止。
解决这个问题的可能方法可能是使用过程。
发布于 2011-05-14 18:16:43
有一个控制器对象,该对象具有一个标志,即线程是否应该停止,每个线程定期检查控制器,如果单击stop按钮,则退出(例如,如果您正在传输文件,则在接收/发送每个块之后,检查是否单击stop )。
https://stackoverflow.com/questions/1611862
复制相似问题