Когда я использую в ActionListener, он просто останавливается - PullRequest
1 голос
/ 28 февраля 2020
startbtn.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent arg0) {
        isRun = true;
        while(isRun)
            runProgram();

    }
});

stopbtn.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        isRun = false;
    }
});

Когда я нажимаю кнопку startbtn, вся программа просто останавливается, и я ничего не могу обработать.

Что не так?

1 Ответ

1 голос
/ 28 февраля 2020

Проблема в том, что при установке переменной isRun на true программа входит в while l oop без выхода. Это происходит в том же потоке, в котором работает GUI, поэтому он перестает отвечать на запросы и не может обработать любое другое событие (например, при щелчке по Остановить действующее действие путем установки isRun в false).

Итак, решение состоит в том, чтобы запустить задачу while l oop в другом потоке, оставляя поток, в котором GUI, свободным для обработки большего количества событий.

Для запуска задача в другом потоке Я рекомендую вам использовать любой из классов в параллельной среде, такой как ExecutorService

Если вы хотите отправить задачу, которая может быть отменив, вы даже можете использовать Future.

Кроме того, помните, что нужно использовать какой-то механизм синхронизации, чтобы оба потока могли видеть последнее значение, присвоенное isRun.

...