使用GUI(Java)启动线程
每当调用线程中的run方法时,我的GUI就会冻结,有人知道为什么吗 主要内容:使用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 (
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资源并保留所有其他资源;我不知道我的错误是什么。谢谢:)