【问题标题】:ExecutorService & Lambdas - difference between .execute(() -> ...) and .execute()ExecutorService 和 Lambdas - .execute(() -> ...) 和 .execute() 之间的区别
【发布时间】:2020-07-14 11:03:22
【问题描述】:

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

public class LongRunningTask implements Runnable {

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

}

一个简单的ExecutorService/ThreadPoolExecutor创建:

final ExecutorService executorService = Executors.newFixedThreadPool(8);

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

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

  • 如果我将它传递给executorService.execute(new LongRunningTask()); 执行,它将按原样执行并且会有结果。

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

【问题讨论】:

  • 你认为() -> new LongRunningTask() 是做什么的?尝试使用非 lambda 语法(作为匿名类)重写它。

标签: java concurrency executorservice java.util.concurrent


【解决方案1】:

这个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);

【讨论】:

    【解决方案2】:

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

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

    • 传递一个实现Runnable的对象:

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

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

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

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

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

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

    【讨论】:

    • 这个答案实际上澄清了一切,谢谢!
    猜你喜欢
    • 2015-07-11
    • 2019-04-11
    • 2015-06-21
    • 2021-06-11
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 2020-02-20
    • 2015-06-08
    相关资源
    最近更新 更多