在Java中执行新操作后,代码块做什么?


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不是实际名称,只是为了显示点而编的。

最新更新