没有什么理论上的。这很实用。该
SwingUtilities.invokeLater()方法可确保中的代码
Runnable将在上运行
EventDispatch Thread(EDT)。这很重要,因为Swing并非线程安全的,因此与GUI(
Swing等)相关的所有操作都需要在上运行
EDT。这
EDT是一个“发生时便会发生”的线程,该线程不保证执行顺序。如果GUI代码是在后台线程(例如,在一个
SwingWorker实例中)内执行的,则可能引发错误。我很难学到这一点:在我的学习生涯中,在后台线程中执行GUI更改代码会导致
RuntimeException我无法弄清的随机不一致的错误。这是一次很好的学习经历(
SwingWorker有一种
doInBackground()后台任务的方法和一个
done()``EDT任务方法)。
与您不想在后台线程上执行GUI代码的方式相同,您也不想在上执行大型操作(数据库查询等)
EDT。这是因为
EDT调度所有GUI事件,因此上的所有内容都
EDT应该简短而优美。您可以
JProgressBar通过不确定的集合轻松地看到这一点。
该SSCCE应该很好地说明它。请注意
JProgressBaras 的运动
method(),一次在后台线程上,一次在
EDT线程上。
import javax.swing.Jframe;import javax.swing.JProgressBar;import javax.swing.SwingWorker;public class Test { public static void main(String args[]) { Jframe frame = new Jframe(); JProgressBar jpb = new JProgressBar(); jpb.setIndeterminate(true); frame.add(jpb); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); frame.setDefaultCloseOperation(Jframe.EXIT_ON_CLOSE); new Task().execute(); } public static void method() { // This is a method that does a time-consuming task. for(int i = 1; i <= 5; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(i); } } static class Task extends SwingWorker<Void, Void> { @Override protected Void doInBackground() throws Exception { method(); return null; } @Override protected void done() { // method(); } }}希望这可以帮助。



