Java - начать цикл, а затем продолжить? - PullRequest
2 голосов
/ 30 апреля 2011

Я сейчас программирую на 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 ]

4 голосов
/ 30 апреля 2011

Все события в приложении Java Swing вызываются в одном потоке событий.

Вам следует создать Swing Timer для вызова любого метода, который вы хотите, когда бы ни случалось.

4 голосов
/ 30 апреля 2011

Сначала вам нужно будет запустить цикл в новом Thread.

А затем, когда пользователь нажимает stop(), вызвать thread.interrupt()

Внутри цикладобавить:

if (Thread.currentThread().isInterrupted()) {
    break;
}
1 голос
/ 30 апреля 2011

Можно использовать SwingWorker .Когда вы больше не хотите, чтобы он запускался, вызовите для него метод cancel () и проверьте наличие isCancelled () в вашем цикле.

1 голос
/ 30 апреля 2011

Необходимо учитывать две вещи.

Во-первых, вы создаете длительный процесс в потоке диспетчеризации событий.Это то, что вы никогда не должны делать.Как указывает Никан, все события GUI в вашем приложении Swing будут вызываться в этой теме.Когда пользователь нажимает кнопку Пуск, ваш actionPerformed в вашем StartListener будет вызываться в EDT.Прочитайте здесь для получения дополнительной информации о Swing Threading.

Это приводит ко второму пункту: вы захотите запустить hotelCalifornia в другом потоке.Вы можете оставить ссылку на эту тему так, чтобы вы могли позвонить thread.interrupt(), как указывает Божо.У вас также есть возможность работать с вашей собственной реализацией, но вы захотите убедиться, что ваш active var объявлен как volatile, чтобы состояние логического значения было немедленно доступно для вашего новогопоток, как только он обновляется.

1 голос
/ 30 апреля 2011

Я предлагаю поместить логику в цикл while в исполняемый файл

class basicThread implements Runnable {
    public void run() {
        while (true) {
            // Put the stuff in your while loop here
        }
    }
}

Настроить поток для выполнения выполняемого файла

// Create a thread to execute your runnable
Thread thread = new Thread(new basicThread());

Затем вызвать ниже в StartListener

thread.start();

и ниже в StopListener

thread.interrupt()
...