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,我能够观察到它的实际结果,所以,我注意到了这一点:
如果我传给它用executorService.execute(() -> new LongRunningTask());
执行,它根本不会执行,不会有结果
如果我将它传递给 executorService.execute(new LongRunningTask());
执行,它将按应有的方式执行,并且会有结果。
使用() ->
的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表达式是Runnable
的run
方法,所以new LongRunningTask()
将是运行.请注意,这不会调用 LongRunningMethod
的 run
方法(您要执行的代码)。这只是调用构造函数。
如果你真的想使用 lambda 表达式(虽然我不明白这一点),你可以这样做:
executorService.execute(() -> new LongRunningTask().run());
我有一个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,我能够观察到它的实际结果,所以,我注意到了这一点:
如果我传给它用
executorService.execute(() -> new LongRunningTask());
执行,它根本不会执行,不会有结果如果我将它传递给
executorService.execute(new LongRunningTask());
执行,它将按应有的方式执行,并且会有结果。
使用() ->
的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表达式是Runnable
的run
方法,所以new LongRunningTask()
将是运行.请注意,这不会调用 LongRunningMethod
的 run
方法(您要执行的代码)。这只是调用构造函数。
如果你真的想使用 lambda 表达式(虽然我不明白这一点),你可以这样做:
executorService.execute(() -> new LongRunningTask().run());