Java8CustomizedThread::new等于new customizedthread()?

o8x7eapl  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(300)

我用两种方法创建runner。但是:新的不起作用。然后我在runner1的构造上标记了调试器点。调试器点也不起作用。谁能告诉我为什么?
runner1::new中的runnable与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");
    }
}
8ehkhllq

8ehkhllq1#

Runnable n1 = Runner1::new 与此代码大致类似:

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

换句话说
Runnable n1 将示例化 Runner1 当它被召唤的时候。
这不是您想要做的,而是您想要示例化 Runner1 并分配新的 Runner1n1 ,就像你对我一样 n2 .
使用 ::new 语法作为 Runnable 不是很有用,因为 Runnable 没有返回值。换句话说:你的
n1 Runnable 将示例化一个 Runner1 但不允许任何其他代码访问它。
路途 ::new 通常用于实现类似于 Supplier 这样地:

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

相关问题