使用GUI(Java)启动线程

使用GUI(Java)启动线程,java,multithreading,user-interface,Java,Multithreading,User Interface,每当调用线程中的run方法时,我的GUI就会冻结,有人知道为什么吗 主要内容: try { // Set System Look and Feel UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (UnsupportedLookAndFeelException e) { // handle exception } catch (

每当调用线程中的run方法时,我的GUI就会冻结,有人知道为什么吗

主要内容:

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");
    }
}

}

这是因为
run()
方法不会启动新线程。假设您的
robot
引用引用了
Runnable
的一个实例,您需要调用以下命令:

new Thread(robot).start();

调用
start()
将启动一个新线程,并对其调用
run()
方法。当前,您的
run()
方法正在调用它的同一个线程上运行(在您的实例中是事件分派线程)。

这是因为
run()
方法没有启动新线程。假设您的
robot
引用引用了
Runnable
的一个实例,您需要调用以下命令:

new Thread(robot).start();

调用
start()
将启动一个新线程,并对其调用
run()
方法。当前,您的
run()
方法正在从中调用它的同一线程上运行(在您的实例中是事件调度线程)。

+1表示
run()
没有启动新线程-但是对于swing,它是事件调度线程而不是主线程,这会导致UI冻结。是的,robot是指Runnable的一个实例。我尝试了你的答案,但是run()中的代码现在没有被执行。@user3742929-你在哪里定义了
robot
引用的
Runnable
?可能您的Runnable的
run()
方法不是有效的重写或类似的方法。我刚刚将您的代码添加到我的IDE中,并使用了
新线程(new RobotThread()).start()并且运行良好。我们是否还缺少任何其他细节,例如
robot
在何处声明和实例化?也就是说,如果不调用
Thread.sleep(x),就不应该使用
while(true){}
在内部,因为否则while循环可能会使用所有可用的CPU资源并保留所有其他资源;我不知道我的错误是什么。感谢:)+1表示
run()
没有启动新线程-但是对于swing,它是事件调度线程而不是主线程,这导致UI冻结。是的,robot引用了Runnable的实例。我尝试了你的答案,但是run()中的代码现在没有被执行。@user3742929-你在哪里定义了
robot
引用的
Runnable
?可能您的Runnable的
run()
方法不是有效的重写或类似的方法。我刚刚将您的代码添加到我的IDE中,并使用了
新线程(new RobotThread()).start()并且运行良好。我们是否还缺少任何其他细节,例如
robot
在何处声明和实例化?也就是说,如果不调用
Thread.sleep(x),就不应该使用
while(true){}
在内部,因为否则while循环可能会使用所有可用的CPU资源并保留所有其他资源;我不知道我的错误是什么。谢谢:)