ExecutorService & Lambdas - .execute(() -> ...) 和 .execute() 之间的区别

For*_*ity 1 java concurrency executorservice java.util.concurrent

我有一个类,它实现了Runnable接口,并且是一个一旦启动就会无限期运行的任务(一个长时间运行的线程)。

public class LongRunningTask implements Runnable {

    @Override
    public void run() {
        //stuff happening here
    }

}
Run Code Online (Sandbox Code Playgroud)

一个简单的ExecutorService/ThreadPoolExecutor创作:

final ExecutorService executorService = Executors.newFixedThreadPool(8);
Run Code Online (Sandbox Code Playgroud)

如果LongRunningTask实际启动/执行,我能够观察到它的实际结果,因此,我注意到了这一点:

  • 如果我传递给它执行executorService.execute(() -> new LongRunningTask());,它根本不会执行,也不会有结果。

  • 如果我通过它来执行executorService.execute(new LongRunningTask());它,它将按照它应该的方式执行并且会有结果。

使用 的 lambda 语法有() ->什么区别?

Swe*_*per 6

execute接受 aRunnable然后run在某个时候调用它的方法。

在您的问题中,您展示了两种传递executea 的方法Runnable

在第一种情况下,new LongRunningTask().run()会被调用。据推测,这是您在//stuff happening here. 这就是您要运行的代码,对吗?

在第二种情况下,lambda 表达式run方法Runnable,因此new LongRunningTask()将运行。请注意,这不调用run的方法LongRunningMethod(代码你想执行)。这只是调用构造函数。

如果您真的想使用 lambda 表达式(尽管我不明白这一点),您可以这样做:

executorService.execute(() -> new LongRunningTask().run());
Run Code Online (Sandbox Code Playgroud)