Java 8 CustomizedThread::new 等于新的 CustomizedThread()?

Java 8 CustomizedThread::new equals new CustomizedThread()?

我通过两种方式创建 Runner。但是 ::new 不起作用。 然后我在 Runner1 的构造上标记了调试器点。调试器点也不起作用。 谁能告诉我为什么?

和Runner1::new中的Runnable有区别吗?

这是我的代码。

 public static void main(String[] args) {
    Runnable n1 = Runner1::new;
    Runnable n2 = new Runner2();

    ExecutorService executorService = Executors.newFixedThreadPool(2);
    executorService.submit(n1);
    executorService.submit(n2);
    while (true) {

    }
}

public static class Runner1 implements Runnable {
    public Runner1() {
        System.out.println("construct 1");
    }

    @Override
    public void run() {
        System.out.println("hello1");
    }
}

public static class Runner2 implements Runnable {
    public Runner2() {
        System.out.println("construct 2");
    }

    @Override
    public void run() {
        System.out.println("hello2");
    }
}

Runnable n1 = Runner1::new 大致类似于这段代码:

Runnable n1 = () -> new Runner1();

换句话说,Runnablen1实例化一个Runner1当它被调用时.

这不是你想要做的,而是你想 实例化一个 Runner1 并将新的 Runner1 分配给 n1,就像您对 n2.

所做的一样

::new 语法用作 Runnable 不是很有用,因为 Runnable 没有 return 值。换句话说:您的 n1 Runnable 实例化 一个 Runner1 但不会使其可供任何其他代码访问。

通常使用::new的方式是像这样实现类似Supplier的东西:

Supplier<List<Object>> emptyListSuppier = ArrayList::new;