为什么可以使用NON Runnable参数创建Thread实例?

时间:2018-12-07 13:59:05

标签: java multithreading initialization functional-interface

我在文章中遇到了这样的代码(我简化了一点):

public class Main {


    static class A {        
    }

    public static void main(String[] args) {
        new Thread(A::new).start();
    }
}

我对该代码感到惊讶,因为从我的角度来看,它必须产生编译时错误,因为Thread构造函数接受RunnableA没有方法run但它可以编译甚至启动,没有任何错误/异常。我在PC上进行了多种检查,但仍然可以正常工作。

所以我有以下问题:

为什么没有编译错误?
哪个方法执行而不是run方法?

1 个答案:

答案 0 :(得分:4)

RunnableFunctionalInterface,也可以用lambda表达式表示,就像您的情况一样:

new Thread(() -> new A())

这不过是方法引用的类似表示

A::new

在您的代码中等同于

new Runnable() {
    @Override
    public void run() {
        new A(); // just creating an instance of 'A' for every call to 'run'
    }
}