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 语法有() ->什么区别?
execute接受 aRunnable然后run在某个时候调用它的方法。
在您的问题中,您展示了两种传递executea 的方法Runnable:
传递一个实现的对象Runnable:
executorService.execute(new LongRunningTask());
Run Code Online (Sandbox Code Playgroud)传递一个不接受任何参数的 lambda 表达式:
executorService.execute(() -> new LongRunningTask());
Run Code Online (Sandbox Code Playgroud)在第一种情况下,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)
| 归档时间: |
|
| 查看次数: |
1757 次 |
| 最近记录: |