Запуск потока с графическим интерфейсом (Java)

1

Мой GUI зависает всякий раз, когда вызывается метод run в потоке, знает ли кто-нибудь почему?

Главный:

try {
        // Set System Look and Feel
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (UnsupportedLookAndFeelException e) {
        // handle exception
    } catch (ClassNotFoundException e) {
        // handle exception
    } catch (InstantiationException e) {
        // handle exception
    } catch (IllegalAccessException e) {
        // handle exception
    }
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                MainFrame frame = new MainFrame(null, null);
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

запустить метод из потока:

public void run() {
    while (true) {
        System.out.println("test");
    }
}

actionListener, который должен запустить поток:

private ActionListener btnStartListener = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        robot.run();
    }
};




public class RobotThread implements Runnable {
@Override
public void run() {
    while (true) {
        System.out.println("test");
    }
}

}

Теги:
multithreading
user-interface

1 ответ

5
Лучший ответ

Это потому, что метод run() не запускает новый поток. Предполагая, что ссылка вашего robot ссылается на экземпляр Runnable вам нужно вызвать следующее:

new Thread(robot).start();

Calling start() запустит новый поток и вызовет на нем метод run(). В настоящее время ваш метод run() запускается в том же потоке, из которого он вызван (в вашем случае поток отправки событий).

  • 1
    +1 для run() не run() новый поток - но с swing это поток диспетчеризации событий, а не основной поток, и это приводит к зависанию пользовательского интерфейса.
  • 0
    @ piet.t - Хорошо, я обновлю свой ответ.
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню