在for循环中进行上下文切换

时间:2019-02-22 21:15:55

标签: java multithreading

我有以下Java代码。在执行过程中会发生“上下文切换”吗?

Collection<MyBusinessClass> myCollection = getMyCollection();//has 1000 items

for (MyBusinessClass item : myCollection) {
 new Thread(() -> {                   
                   MyLongRunningTask();
                }).start();

谢谢。

1 个答案:

答案 0 :(得分:1)

除非您有足够的内核来托管所有1000个线程(短暂地增加了1个主线程),再加上JVM需要的诸如GC和finalizer之类的几个线程,否则您的线程将必须共享内核。因此,上下文切换将发生。我在这里假设MyLongRunningTask实际上运行了足够长的时间,以使它们在生成最后一个时都仍然处于活动状态,否则可能所需的可用核数可能会少一些。

我们可以尝试构想一个场景,即调度程序实际上是通过非常短的任务(或相当疯狂的调度程序)依次顺序运行所有任务,而不是“重叠”的,因此您可以摆脱少量的CPU核心。但这似乎不合时宜。