如果我们在 Java 多线程中传递 executorService 执行调用中的线程会发生什么



请参阅这两个示例:

例 1

public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool();

Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
//work
for (int i = 0 ; i < 5 ; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
executorService.execute(thread1);
executeService.shutdown();
}

例 2

public static void main(String[] args) throws InterruptedException {
ExecutorService executorService = Executors.newCachedThreadPool();
executorService.execute(new Runnable() {
@Override
public void run() {
//work
for (int i = 0 ; i < 5 ; i++){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
executeService.shutdown();
}

两种情况下的结果是相同的,但我来自StackOverflow的一位朋友alexei-kaigorodov(在这个问题中)在评论中说:

"执行者服务是履带的替代品。将线程放在执行器服务中是没有意义的。首先,创建 Runnable,然后将其作为参数放入线程并启动该线程,或者将该可运行提交到执行器服务。

我希望我的问题很清楚,所以请告诉我将可运行传递给 ExecuteService 与将线程传递给 ExecutableService 的区别。

Thread implements Runnable

,因此执行器服务将接受它作为一个简单的Runnable,从而调用Thread.run()方法。

这意味着Thread本身永远不会启动,除非您自己调用其start()方法,在这种情况下,结果肯定是未定义的。

因此,您可以说代码片段的行为相同,您只是将Runnable传递给ExecutorService然后通过调用Runnable.run()方法来执行它。

最新更新