首页 > 解决方案 > 在线程中使用 Lambda

问题描述

ThreadWorker当我使用方法引用在 Thread 的构造函数中创建新对象或传递 Lambda 以创建新对象时不执行。

但是当我ThreadWorker单独创建对象并将其传递给 Thread 类时它工作正常。

public class RunnableImpl {
    public static void main(String[] args) throws InterruptedException {
        ThreadWorker th= new ThreadWorker();
        Thread t1 = new Thread(th);
        t1.start();
        t1.join();
        System.out.println("Main method terminated");
    }
}

class ThreadWorker implements Runnable {

    @Override
    public void run() {
        int[] arr = { 1, 4, 8, 9, 1, 0, 4, 5, 4 };
        System.out.println(Arrays.stream(arr).sum());
    }
}

例如,如果我使用 lambda:

Thread t1 = new Thread(ThreadWorker :: new);

或者

Thread t1 = new Thread(() ->new ThreadWorker());

那么没有输出,但如果我ThreadWorker单独创建对象,那么程序运行正常。

有人可以告诉我,这怎么可能?

标签: javamultithreading

解决方案


两个都

new Thread(() -> new ThreadWorker());

new Thread(ThreadWorker::new);

create aThreadRunnable实例的run()方法只是创建一个ThreadWorker实例,并且对它不做任何事情。的run()方法ThreadWorker不执行。

它们等效于传递以下匿名类实例:

Thread t = new Thread(new Runnable() {
                                         public void run() {
                                             new ThreadWorker ();
                                         }
                                     });

如果要使用 lambda 表达式,则需要:

new Thread(() -> new ThreadWorker().run());

如果你想要一个方法参考,你需要:

new Thread(new ThreadWorker()::run);

也就是说,以下内容要简单得多:

new Thread(new ThreadWorker());

推荐阅读