我注意到在下面的 Java 程序中,操作系统非常随机地切换线程。
这让我想知道:操作系统“决定”切换线程的原因和时间?
例如,考虑以下程序:
class NewThread extends Thread {
private String message;
public static void main(String[] args)
{
NewThread threadOne = new NewThread("1");
NewThread threadTwo = new NewThread("2");
threadOne.start();
threadTwo.start();
}
public NewThread(String message) {
this.message = message;
}
@Override
public void run() {
doLoop(message);
}
public void doLoop(String message)
{
for (int i = 0; i < 10000; i++)
{
System.out.println(message);
}
}
}
对于输出,我得到一长串 1
,然后在某个时候我得到这个:
1
1
1
2
1
2
2
2
2
2
为什么会这样?操作系统什么时候切换线程?
据我所知,for loops
不能同时运行(至少不能与单核处理器一起运行)。这让我想知道是什么触发了操作系统这样做?
最佳答案
线程切换
为什么?
处于 Activity 状态的每个线程都应该相互并行运行(从程序员的角度来看)。但是,由于核心数有限,因此不实用。因此,您的处理器支持的线程数可以并行运行。在四核处理器中,您的两个线程实际上会并行运行,但 10 个线程不会。为了创造并行执行的错觉,线程切换必须定期进行。
什么时候?
没有人能回答这个问题。它实际上取决于 JRE 实现、底层硬件功能和无数其他因素(如其他正在运行的软件的负载)。在这种情况下,操作系统也很重要。它被程序员认为是不可预测的(我们永远不应该假设或依赖顺序和切换时间)。
如何检查?
您当前用于检查执行顺序的方法具有误导性。在这里,共享对象
System.out
被使用,它被每个线程缓存(希望如此)并且输出将与实际内存和 io 同步,无论实际执行顺序如何.它在单核处理器上可能有意义,但仅在某些实现上有意义。
我们使用 java 来获得平台独立性(主要),这是一个高度不可预测的事情,它依赖于我们甚至无法列出的如此多的参数。 (如果你做了一个,它会在下一次 java 更新时过时(可能),而且它不会对所有平台都一样)。所以我建议您假设(就用 Java 编写程序而言)它们将并行执行。
出于学术目的,如果您要对其进行更多搜索和研究,这确实是一个有趣的话题。如果您发现有趣的事情,也请告诉我们。 :)
希望这对您有所帮助...
干杯
关于java - 操作系统在多线程程序中什么时候切换线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22511211/