Runnable如何实现类看起来像?

时间:2018-04-13 13:43:47

标签: java

Java中的新功能,请耐心等待我:)

我正在使用JFrame,使用EventQueue.invokeLater处理事件。

以下是代码段

public class Library extends JFrame {
    static Library frame;
    private JPanel contentPane;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    frame= new Library();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

我的问题是,当匿名类实现Runnable时,它的外观如何。当我创建匿名类的新对象时,我认为它看起来像下面。

public class Anonymous implements Runnable {

    Anonymous(){
        Thread newThread = new Thread(this);
        newThread.run();  //from here my above it enters into above implementation of run method and executes the code within it. Is it correct ?
    }

    public static void main(String[] args){     
        Runnable Object = new Anonymous();      
    }
}

当我们以上述方式实现Runnable时,它的工作方式是什么?如果没有人可以帮我理解这个?

由于

2 个答案:

答案 0 :(得分:0)

如果实现接口,则必须提供该接口的所有方法。这有时称为合同编程。

如果Anonymous实现了Runnable,它必须有一个run()方法。然后创建一个Anonymous实例并调用它。

Anonymous annon = new Anonymous();
 EventQueue.invokeLater(annon);

https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html

答案 1 :(得分:0)

Runnable只是一个界面,它的实现与其他任何一样。它被广泛使用的事实并没有使它在实现方面具有特殊性(不要将它与线程或它通常在旁边显示的任何东西相关联)。

有许多方法可以为接口提供实现,其中最常见的是:

1 - 定义类和实现接口
请注意,您的声明无效,因为它未提供run方法的实现。

class Anonymous implements Runnable {
    public void run() {
        try {
            frame= new Library();
            frame.setVisible(true);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

您可以使用以下内容:

EventQueue.invokeLater(new Anonymous());

2 - 内部课程,就像您的第一个示例一样。这是Java编译为接口实现的完整类

3 - Lambdas :这些将起作用因为Runnable是一个功能界面:

EventQueue.invokeLater(() -> {
    try {
        frame= new Library();
        frame.setVisible(true);
    } catch (Exception e) {
        e.printStackTrace();
    }
});

4 - 方法参考:假设一个静态方法Library.makeFrameVisible

private static void makeFrameVisible() {
    try {
        frame= new Library();
        frame.setVisible(true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

您可以使用方法参考来调用它:

EventQueue.invokeLater(Library::makeFrameVisible);

以上所有都是制作Runnable界面的可行方法,您将看到多种形式的可运行实例,包括上面的那些......