Java - 启动循环然后继续?

时间:2011-04-30 06:49:58

标签: java loops actionlistener

我目前正在用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!
        }
    }
}

但是一旦启动循环,程序只执行循环的动作。有没有解决的办法?有没有更好的方法来实现我的目标?

谢谢!

5 个答案:

答案 0 :(得分:4)

首先,您必须以新的Thread启动循环。

然后,当用户按下stop()时,请致电thread.interrupt()

在循环内添加:

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

答案 1 :(得分:4)

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

你应该创建一个Swing Timer来随意调用你想要的任何方法。

答案 2 :(得分:1)

我建议将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()

答案 3 :(得分:1)

有两件事需要考虑。

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

这导致了第二点:您将希望在不同的线程中运行hotelCalifornia。你可以保留一个参考这个帖子,以便你可以像Bozho指出的那样打电话给thread.interrupt()。您还可以选择使用自己的实现,但是您需要确保将active var声明为volatile,以便新线程可以立即访问布尔值的状态它已更新。

答案 4 :(得分:1)

选项是使用SwingWorker。 如果您不再希望它运行,请在其上调用cancel()方法,并在循环中检查isCancelled()。