我有以下Java代码。在执行过程中会发生“上下文切换”吗?
Collection<MyBusinessClass> myCollection = getMyCollection();//has 1000 items
for (MyBusinessClass item : myCollection) {
new Thread(() -> {
MyLongRunningTask();
}).start();
谢谢。
答案 0 :(得分:1)
除非您有足够的内核来托管所有1000个线程(短暂地增加了1个主线程),再加上JVM需要的诸如GC和finalizer之类的几个线程,否则您的线程将必须共享内核。因此,上下文切换将发生。我在这里假设MyLongRunningTask
实际上运行了足够长的时间,以使它们在生成最后一个时都仍然处于活动状态,否则可能所需的可用核数可能会少一些。
我们可以尝试构想一个场景,即调度程序实际上是通过非常短的任务(或相当疯狂的调度程序)依次顺序运行所有任务,而不是“重叠”的,因此您可以摆脱少量的CPU核心。但这似乎不合时宜。