例如,有一个代码:
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 */
答案 0 :(得分:1)
线程一个接一个地启动,因为for循环只在一个执行一个语句的线程(主线程)中执行。它非常快,所以你可以认为它是在同一时间执行的。
答案 1 :(得分:1)
线程一个接一个地启动(非常非常快)。如果他们正在做任何有意义的事情,他们就会并行运行。
来自the documentation of Executors.newCachedThreadPool
:
创建一个根据需要创建新线程的线程池,但在它们可用时将重用以前构造的线程。这些池通常会提高执行许多短期异步任务的程序的性能。如果可用,执行调用将重用先前构造的线程。如果没有可用的现有线程,则将创建一个新线程并将其添加到池中。
所以你的循环请求执行10 SomeRunnable
个runnables。池将根据需要创建线程以适应这种情况。它最终可能会创建10个线程,或者如果runnables 令人惊讶短暂,则可能会在到达for
循环结束时重用一些早期的线程。 (似乎不太可能,但这是理论上的可能性。)