在线程中使用Lambda

Ati*_*ain 1 java multithreading

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

例如,如果我使用lambda:

Thread t1 = new Thread(ThreadWorker :: new);
Run Code Online (Sandbox Code Playgroud)

要么

Thread t1 = new Thread(() ->new ThreadWorker());
Run Code Online (Sandbox Code Playgroud)

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

有人可以让我知道,怎么可能?

Era*_*ran 6

new Thread(() -> new ThreadWorker());
Run Code Online (Sandbox Code Playgroud)

new Thread(ThreadWorker::new);
Run Code Online (Sandbox Code Playgroud)

创建ThreadRunnable实例的run()方法仅创建一个ThreadWorker实例,而对其不执行任何操作。的run()方法ThreadWorker未执行。

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

Thread t = new Thread(new Runnable() {
                                         public void run() {
                                             new ThreadWorker ();
                                         }
                                     });
Run Code Online (Sandbox Code Playgroud)

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

new Thread(() -> new ThreadWorker().run());
Run Code Online (Sandbox Code Playgroud)

如果要引用方法,则需要:

new Thread(new ThreadWorker()::run);
Run Code Online (Sandbox Code Playgroud)

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

new Thread(new ThreadWorker());
Run Code Online (Sandbox Code Playgroud)