invokeLater和invokeAndWait

来源:互联网 发布:网络推广学什么 编辑:程序博客网 时间:2024/06/18 03:09

invokeLater和invokeAndWait的区别

invokeLater:在把可运行的对象放入队列后就返回,而invokeAndWait一直等待已启动了可运行的run方法才返回。如果一个操作在另外一个操作执行前必须从一个组件获得信息,则invokeAndWait方法很有用的。

    public class SwingDemoInvokeAndWait {          public static void main(String[] argv) throws InterruptedException, InvocationTargetException {              SwingUtilities.invokeAndWait(new Runnable() {                  @Override                 public void run() {                      constructUI();                  }              });              final Runnable doHelloWorld = new Runnable() {                  public void run() {                      System.out.println("Hello World on " + Thread.currentThread());                  }              };              Thread appThread = new Thread() {                  public void run() {                      try {                          SwingUtilities.invokeAndWait(doHelloWorld);                      } catch (Exception e) {                          e.printStackTrace();                      }                      System.out.println("Finished on " + Thread.currentThread());                  }              };              appThread.start();          }          private static void constructUI() {              JLabel bulletin = new JLabel("Hello,World!", JLabel.CENTER);              JFrame frame = new JFrame("Bulletin");              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);              frame.getContentPane().add(bulletin);              frame.setSize(200, 150);              frame.setVisible(true);              bulletin.setForeground(Color.RED);          }      } 

由于doHelloWorld是在invokeAndWait中被执行的,所以 一定会等待doHelloWorld方法的执行并返回,即”Hello World on”一定会在”Finished on”前显示出来。

    import java.awt.Color;      import java.lang.reflect.InvocationTargetException;      import javax.swing.JFrame;      import javax.swing.JLabel;      import javax.swing.SwingUtilities;      public class SwingDemoInvokeLater {          public static void main(String[] argv) throws InterruptedException, InvocationTargetException {              final Runnable doHelloWorld = new Runnable() {                  public void run() {                      System.out.println("Hello World on " + Thread.currentThread());                  }              };              Thread appThread = new Thread() {                  public void run() {                      try {                          SwingUtilities.invokeLater(doHelloWorld);                      } catch (Exception e) {                          e.printStackTrace();                      }                      System.out.println("Finished on " + Thread.currentThread()+",but this might well be displayed before the other message.");                  }              };              appThread.start();          }          private static void constructUI() {              JLabel bulletin = new JLabel("Hello,World!", JLabel.CENTER);              JFrame frame = new JFrame("Bulletin");              frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);              frame.getContentPane().add(bulletin);              frame.setSize(200, 150);              frame.setVisible(true);              bulletin.setForeground(Color.RED);          }      } 

由于doHelloWorld是在invokeLater中被执行的,因而“Finished on”有可能出现在其他信息的前面比如”Hello World On”。

参考文章:http://developer.51cto.com/art/201201/313034.htm
http://blog.csdn.net/legendmohenote/article/details/5853833
http://blog.csdn.net/yanwushu/article/details/39434159

0 0
原创粉丝点击