【问题标题】:Java 8 CustomizedThread::new equals new CustomizedThread()?Java 8 CustomizedThread::new 等于 new CustomizedThread()?
【发布时间】:2021-10-03 05:27:44
【问题描述】:

我通过两种方式创建 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");
    }
}

【问题讨论】:

    标签: java lambda threadpool


    【解决方案1】:

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

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

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

    这不是您想要做的,而是您想要实例化 Runner1 并将新的 Runner1 分配给 n1,就像您对 n2 所做的那样。 p>

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

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

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

    【讨论】:

    • 好的,我想我明白了。 () -> 新的 Runner1();等于一个抽象实现,例如 new Runnable {public void run() {new Runner1()}} 。谢谢,这对我帮助很大
    • 对,我明白了。是的,你的改写更清楚了,谢谢
    猜你喜欢
    • 2020-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2013-12-23
    • 2010-10-15
    • 2012-02-19
    相关资源
    最近更新 更多