Java 如何线程化 GUI
Java How to thread a GUI
所以我有一个打开 while 循环的按钮,然后我的整个 GUI 冻结,直到 while 循环结束,也就是说我如何让我的 GUI 每秒更新一次?
JButton Test= new JButton();
Test.setText("Test");
Test.setSize(230, 40);
Test.setVisible(true);
Test.setLocation(15, 290);
Test.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e){
int x = 0;
while(x<500){
x++
});
这很明显,因为 Swing 对象不是线程安全的,因此我们提供了 SwingUtilities.invokeLater()
,它允许在稍后的某个时间点执行任务。
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
int x = 0;
while(x<500){
x++
}
}
});
使用ExecutorService
class
Test.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ExecutorService es = Executors.newCachedThreadPool();
es.submit(new Runnable() {
@Override
public void run() {
int x = 0;
while (x < 500) {
x++;
}
}
});
}
});
主要的想法是您的 GUI 冻结,因为您在负责绘制 GUI 的线程中进行大量处理;解决方案是将计算或任何容易占用时间的处理委托给将在后台执行的线程。 https://docs.oracle.com/javase/tutorial/uiswing/concurrency/
所以我有一个打开 while 循环的按钮,然后我的整个 GUI 冻结,直到 while 循环结束,也就是说我如何让我的 GUI 每秒更新一次?
JButton Test= new JButton();
Test.setText("Test");
Test.setSize(230, 40);
Test.setVisible(true);
Test.setLocation(15, 290);
Test.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e){
int x = 0;
while(x<500){
x++
});
这很明显,因为 Swing 对象不是线程安全的,因此我们提供了 SwingUtilities.invokeLater()
,它允许在稍后的某个时间点执行任务。
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
int x = 0;
while(x<500){
x++
}
}
});
使用ExecutorService
class
Test.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
ExecutorService es = Executors.newCachedThreadPool();
es.submit(new Runnable() {
@Override
public void run() {
int x = 0;
while (x < 500) {
x++;
}
}
});
}
});
主要的想法是您的 GUI 冻结,因为您在负责绘制 GUI 的线程中进行大量处理;解决方案是将计算或任何容易占用时间的处理委托给将在后台执行的线程。 https://docs.oracle.com/javase/tutorial/uiswing/concurrency/