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

ExecutorService & Lambdas - difference between .execute(() -> ...) and .execute()

我有一个class,它实现了Runnable接口,是一个任务,一旦启动就会运行无限期(一个long-运行ning线程) .

public class LongRunningTask implements Runnable {

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

}

一个简单的ExecutorService/ThreadPoolExecutor创作:

final ExecutorService executorService = Executors.newFixedThreadPool(8);

如果 LongRunningTask 实际上是 started/executed,我能够观察到它的实际结果,所以,我注意到了这一点:

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

executorService.execute(() -> new LongRunningTask()); 将创建一个新的 Runnable 对象,其中 run 方法的主体与 new LongRunningTask() 相同,因此它只会创建对象。

所以executorService.execute(() -> new LongRunningTask());等于这个

executorService.execute(new Runnable() {
    @Override
    public void run() { // this run method's body will be executed by the service
        new LongRunningTask(); // just create the object
    }
});

另一边 new LongRunningTask() 是可运行对象本身,它的 run 方法将被调用,其中包含实际的可执行代码。

可以参考方法进一步优化

executorService.execute(LongRunningTask::new);

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

在您的问题中,您演示了两种传递 execute a Runnable:

的方法
  • 传递一个实现 Runnable:

    的对象
    executorService.execute(new LongRunningTask());
    
  • 传递不接受参数的 lambda 表达式:

    executorService.execute(() -> new LongRunningTask());
    

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

在第二种情况下,lambda表达式Runnablerun方法,所以new LongRunningTask()将是运行.请注意,这不会调用 LongRunningMethodrun 方法(您要执行的代码)。这只是调用构造函数。

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

executorService.execute(() -> new LongRunningTask().run());