Разблокировать поток из другого

165
04 июня 2019, 10:50

Пытаюсь создать с помощью swing интерфейс, пока безуспешно. Задача: по нажатию кнопки "Start" разблокировать поток InitAll при условии изменения переменной calculationIsActive,которая определена в классе GUI и изменяется при нажатии этой же кнопки, и после чего вызывается метод displayModelState(также определенный в GUI), который в цикле обновляет количество машин в очереди, выводя это в интерфейс. В main инициализирую интерфейс:

 public class Main {
    public static void main(String[] args) {
    GUI GUI = new GUI();
    GUI.setVisible(true);
    InitAll initAll = new InitAll(GUI);
    initAll.start();
    }
}

Далее запускается новый поток, выглядящий так:

public class InitAll extends Thread{
ReentrantLock locker;
Condition condition;
GUI GUI;
public InitAll(GUI GUI) {
    this.GUI = GUI;
    locker = new ReentrantLock();
    condition = locker.newCondition();
}
@Override
public void run() {
    locker.lock();
    try {
        while (!(GUI.calculationIsActive)) {
            condition.await();
        }
        condition.signalAll();
        GUI.displayModelState();
    } catch (InterruptedException exs) {
        System.out.println("Some error occurred");
    } finally {
        locker.unlock();
    }
}

}

Ну и сам класс графического интерфейса:

public class GUI extends JFrame {
/*Объявление некоторых элементов интерфейса*/
public volatile boolean calculationIsActive = false;
public void displayModelState() {
    while(calculationIsActive) {
        QueueSizeLabel.setText(CarQueue.queueSize + "");
    }
}
public GUI() {
    setContentPane(rootPanel);
    setTitle("Gas station");
    pack();
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    threadManager = new ThreadManager();
    stopButton.setEnabled(false);
    startButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            calculationIsActive = true;
            stopButton.setEnabled(true);
            threadManager.startCalculations();
        }
    });
}

}

Мне казалось, что должно работать, но поток не выходит из ожидания при изменении calculationIsActive, сколько бы раз я кнопку "Start" не нажимал. Помогите, пожалуйста.

Answer 1
GUI.setVisible(true)

блокрует текуший поток до тех пор пока фрейм не будет закрыт.

Так что код

InitAll initAll = new InitAll(GUI);
initAll.start();

не выполняется.

Попробуйте перенестиего до setVisible.

READ ALSO
Java нужна перменая типа double [дубликат]

Java нужна перменая типа double [дубликат]

На данный вопрос уже ответили:

152
Плагин для eclipse, использующий qt

Плагин для eclipse, использующий qt

Имеется некое оконное приложение написанное с помощью QtЕсть ли возможность встроить его в eclipse? Я знаю, что плагины для него можно писать...

119
Пропуск кода при выполнении

Пропуск кода при выполнении

Не могу понять в чём проблемаВот код :

153