SwingUtilities.invokeLater(new Runnable() {
public void run() {
Example ex = new Example();
ex.setVisible(true);
}
});
new Runnable()
后面有一段代码。我如何理解这段代码?我不记得我们可以将代码块直接传递给java中的任何对象。
它不是一个代码块。它是一个对象。
当你说
new Runnable()
您正在创建一个实现Runnable接口的对象,特别是run()
方法。
如方法名称所示,invokeLater()
将在稍后的某个时间点调用您的可运行接口实现对象(或可运行对象)的run()
方法。
正如另一个海报提到的,这是一个匿名类的例子。它确实是一种以更简洁的方式快速编写代码的便利机制。如果你不喜欢这样,你可以这样做-
创建一个实现Runnable的新类-
public class RunnableImplementation implements Runnable
{
public void run()
{
Example ex = new Example();
ex.setVisible(true);
}
}
然后,示例中的代码变成-
SwingUtilities.invokeLater(new RunnableImplementation());
它正在创建一个匿名内部类的实例。与从Runnable
派生命名类并创建它的实例不同,您可以内联地完成整个过程。
您没有传递任何代码块,您实际上重写了Runnable
类的run
方法
如何理解这段代码?这就是所谓的swing event queue
,它有助于防止并发问题。它按顺序对该队列中的每个Runnable
对象调用方法run()
。
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Example ex = new Example();
ex.setVisible(true);
}
});
等价于
SwingUtilities.invokeLater(new MyRunnable() );
其中MyRunnable
是一个类,它使用您拥有的代码实现Runnable
接口,并且仅为此目的而创建,不能再次使用。
注意MyRunnable
不是实际名称,只是为了显示点而编的。