Java 线程是同时启动还是有';他们之间有什么耽搁?

Java 线程是同时启动还是有';他们之间有什么耽搁?,java,multithreading,executorservice,Java,Multithreading,Executorservice,例如,有一个代码: ExecutorService exec = Executors.newCachedThreadPool(); for(int i = 0; i < 1000000; i++) exec.execute(new SomeRunnable()); 当for循环在一次只执行一条语句的一个线程(主线程)中执行时,线程会一个接一个地启动。它非常快,因此您可能会认为它是同时执行的。线程一个接一个地启动(非常、非常快)。如果他们正在做任何有意义的事情,他们将并行运行 发件

例如,有一个代码:

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

当for循环在一次只执行一条语句的一个线程(主线程)中执行时,线程会一个接一个地启动。它非常快,因此您可能会认为它是同时执行的。

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

发件人:

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


因此,循环请求执行10个
SomeRunnable
runnables。该池将根据需要创建线程以容纳该线程。它可能最终会创建10个线程,或者如果可运行程序的寿命非常短,那么当您到达
for
循环的末尾时,它可能能够重用一些早期的线程。(这似乎不太可能,但这是一种理论上的可能性。)

你凭什么认为他们会这么做?为什么您认为编译器与线程在运行时的启动方式有任何关联?阅读Executors.newCachedThreadPool()的javadoc。很抱歉,newCachedPool是一个打字错误。应该可以很容易地提供更多关于您的混淆、线程之间不久发生的事情、添加打印语句时得到的输出与您期望的相比是什么?我无法想象常见的概念。如果任务没有相同的开始时间,它们如何同时执行?@luckystrrike你开始让水沸腾。然后你开始解冻一些肉。然后你开始看新闻。所有这些任务不会同时启动。但一旦启动,它们都同时执行:当你观看新闻时,水加热,肉解冻。这不是很自然吗?
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 */