线程是同时启动还是它们之间存在延迟?

时间:2017-08-19 14:19:11

标签: java multithreading executorservice

例如,有一个代码:

ExecutorService exec = Executors.newCachedThreadPool();
for(int i = 0; i < 1000000; i++)
    exec.execute(new SomeRunnable());

语句for执行1000000次启动线程并运行其任务的操作。

我们建议同时启动这些线程。嗯,好的,但是如果一个语句for一致地执行它们的操作,那么线程如何同时启动:第一个,第二个,第三个,依此类推?

for(int i=1; i<11; i++) {
    System.out.println("Count is: " + i);
}

// Actions are happened step-by-step, not simultaneosly
/* The output is:
Count is: 1
Count is: 2
Count is: 3
Count is: 4
Count is: 5
and so on */

2 个答案:

答案 0 :(得分:1)

线程一个接一个地启动,因为for循环只在一个执行一个语句的线程(主线程)中执行。它非常快,所以你可以认为它是在同一时间执行的。

答案 1 :(得分:1)

线程一个接一个地启动(非常非常快)。如果他们正在做任何有意义的事情,他们就会并行运行。

来自the documentation of Executors.newCachedThreadPool

  

创建一个根据需要创建新线程的线程池,但在它们可用时将重用以前构造的线程。这些池通常会提高执行许多短期异步任务的程序的性能。如果可用,执行调用将重用先前构造的线程。如果没有可用的现有线程,则将创建一个新线程并将其添加到池中。

所以你的循环请求执行10 SomeRunnable个runnables。池将根据需要创建线程以适应这种情况。它最终可能会创建10个线程,或者如果runnables 令人惊讶短暂,则可能会在到达for循环结束时重用一些早期的线程。 (似乎不太可能,但这是理论上的可能性。)