您的位置:首页 > 大数据 > 人工智能

invokeLater和invokeAndWait

2017-03-07 15:15 253 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: