gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 07:43:20 27 4
gpt4 key购买 nike

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

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 语法有什么不同?

最佳答案

execute 接受 Runnable,然后在某个时刻调用其 run 方法。

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

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

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

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

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

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

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

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

关于java - ExecutorService 和 Lambdas - .execute(() -> ...) 和 .execute() 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60992195/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com