Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何用按钮停止循环?_Java_Loops_Button - Fatal编程技术网

Java 如何用按钮停止循环?

Java 如何用按钮停止循环?,java,loops,button,Java,Loops,Button,我正在写一个程序,当开始按钮被点击时,它会启动一个循环,我想用一个停止按钮来停止它。问题是当循环开始时,按钮在循环完成之前不起作用。 我搜索过类似的问题,了解到问题是循环正在执行,但我无法将循环带到执行的操作之外。 我尝试过创建一个新的类,并要求它等等,但完全相同的事情发生了。 顺便说一句,我也是Java初学者,如果我做错了什么,我很抱歉。 简单代码: OtherClass obj; public void actionPerformed(ActionEvent e) { if(e.ge

我正在写一个程序,当开始按钮被点击时,它会启动一个循环,我想用一个停止按钮来停止它。问题是当循环开始时,按钮在循环完成之前不起作用。 我搜索过类似的问题,了解到问题是循环正在执行,但我无法将循环带到执行的操作之外。 我尝试过创建一个新的类,并要求它等等,但完全相同的事情发生了。 顺便说一句,我也是Java初学者,如果我做错了什么,我很抱歉。
简单代码:

OtherClass obj;
public void actionPerformed(ActionEvent e) {
    if(e.getSource() == startButton) {
    while(true) {
        obj = new OtherClass();
        obj.doJob();
    }
    else if(e.getSource() == stopButton) {
    obj.stopLoop();
    }
}

public class OtherClass  {
    private boolean isStopped = false;
    public OtherClass() {
    }
    public void doJob(){
        while(true) {
            //loop...
            if(isStopped) {
                break;
            }
        }
    }
您需要在单独的线程(也称为“工作线程”)中运行doJob()。按下按钮时启动线程,再次按下时将ISSTTOPED标志设置为true。注意不要在工作线程中执行UI操作(例如更新进度条)——需要调用一些特殊方法来从工作线程更新UI

由于这是一个非常普遍的问题(我的回答也非常普遍),我建议在Google上寻找“AWT ui线程”、“工作线程”和“Java线程”

一个好的起点可能是

您需要在单独的线程(也称为“工作线程”)中运行doJob()。按下按钮时启动线程,再次按下时将ISSTTOPED标志设置为true。注意不要在工作线程中执行UI操作(例如更新进度条)——需要调用一些特殊方法来从工作线程更新UI

由于这是一个非常普遍的问题(我的回答也非常普遍),我建议在Google上寻找“AWT ui线程”、“工作线程”和“Java线程”


一个好的起点是你应该使用一个线程。如果在主线程中运行循环,gui将被冻结,直到循环结束

我们开始:

class yourClass{
...
private volatile boolean threadRunning = false;

public void startThread(){
  Thread t = new Thread(new Runnable(){
      @Override
      public void run(){
          threadRunning = true;
          while(threadRunning){
              //do some job
          }
      }
  });
  t.start();
}

要停止循环,只需添加一个按钮并将threadRunning设置为false

您应该使用线程。如果在主线程中运行循环,gui将被冻结,直到循环结束

我们开始:

class yourClass{
...
private volatile boolean threadRunning = false;

public void startThread(){
  Thread t = new Thread(new Runnable(){
      @Override
      public void run(){
          threadRunning = true;
          while(threadRunning){
              //do some job
          }
      }
  });
  t.start();
}

要停止循环,只需添加一个按钮并将threadRunning设置为false

Perroloco解决方案是可以的,但最好使用原子布尔值而不是普通布尔值。
原因是,您将有两个线程修改/读取共享资源(工作线程和UI线程)

Perroloco解决方案是可以的,但是如果使用原子布尔值而不是普通布尔值会更好。
原因是,您将有两个线程修改/读取共享资源(工作线程和UI线程)

您必须在新线程中启动循环。@halex您可以将此作为答案发布:)这是我们使用线程停止循环的时候!您必须在新线程中启动循环。@halex您可以将此作为答案发布:)这是我们使用线程停止循环的时候!