首页 > 解决方案 > for循环中的上下文切换

问题描述

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

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

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

谢谢。

标签: javamultithreading

解决方案


除非您有足够的核心来托管所有 1000 个线程(+ 1 个主要线程)+ JVM 需要的任何少量线程,例如 GC 和终结器,否则您的线程将不得不共享核心。因此会发生上下文切换。我在这里假设MyLongRunningTask实际上运行了足够长的时间,以使它们在最后一个生成时仍然处于活动状态,否则所需的可用内核数量可能会低一些。

我们可以尝试通过具有非常短的任务(或相当疯狂的调度程序)来构建调度程序实际上如何顺序运行所有任务的场景,而不是“重叠”,这样您就可以摆脱少量的 CPU 内核。但这似乎离题了。


推荐阅读