Java-开始一个循环,然后继续?

Java-开始一个循环,然后继续?,java,loops,actionlistener,Java,Loops,Actionlistener,我目前正在用Java编程。当用户按下程序的开始按钮时,我想要一个循环开始。但是,我希望用户能够使用停止按钮停止循环: public class Program { private boolean active; // MVC stuff... private class StartListener implements ActionListener { public void actionPerformed(ActionEvent e) {

我目前正在用Java编程。当用户按下程序的开始按钮时,我想要一个循环开始。但是,我希望用户能够使用停止按钮停止循环:

public class Program {
    private boolean active;

    // MVC stuff...

    private class StartListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            // Do stuff...

            active = true;
            hotelCalifornia();
        }
    }

    private class StopListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            // Do stuff...

            active = false;
        }
    }

    public void hotelCalifornia() {
        while (this.active) {
            // The program never leaves!
        }
    }
}
但一旦循环启动,程序只执行循环的操作。有办法解决这个问题吗?有没有更好的方法来实现我的目标


谢谢

首先,您必须在新的
线程中启动循环

然后,当用户按下
stop()
,调用
thread.interrupt()

在循环内添加:

if (Thread.currentThread().isInterrupted()) {
    break;
}

Java Swing应用程序中的所有事件都在单个事件线程中调用


您应该创建一个函数,以便在如此频繁的情况下调用所需的任何方法

我建议将逻辑放在可运行的while循环中

class basicThread implements Runnable {
    public void run() {
        while (true) {
            // Put the stuff in your while loop here
        }
    }
}
设置一个线程来执行您的runnable

// Create a thread to execute your runnable
Thread thread = new Thread(new basicThread());
然后打电话给下面的StartListener

thread.start();
下面是StopListener

thread.interrupt()

<>有两件事要考虑。

首先,您正在事件分派线程中创建一个长时间运行的进程。这是你永远不应该做的事情。正如Nican指出的,Swing应用程序中的所有GUI事件都将在此线程中调用。当用户按下开始按钮时,您的
StartListener
中执行的
操作将在EDT中调用。有关Swing线程的更多信息,请阅读


这引出了第二点:您将希望在不同的线程中运行您的
hotelCalifornia
。您可以保留对这个线程的引用,这样您就可以调用
thread.interrupt()
,正如Bozho指出的那样。您还可以选择使用自己的实现,但您需要确保将
活动
变量声明为,以便布尔值的状态在更新后立即可供新线程访问。

一个选项是使用。 当您不再希望它运行时,对其调用cancel()方法,并在循环中检查isCancelled()