java - 操作系统在多线程程序中什么时候切换线程?

标签 java multithreading theory

我注意到在下面的 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/

相关文章:

c++ - "release sequence"是什么意思?

ios - 在单独的线程/进程中运行音频引擎,从主线程发送和接收消息

regex - 是否存在可以确定一种常规语言是否匹配任何输入,另一种常规语言匹配的算法?

java - Appium如何验证两个子节点属于同一个父节点

java - 我如何在其他 Activity 中发送正确答案和所选答案?

c# - 如何在1秒钟内调用函数200次

theory - 驱动程序是什么意思?

java - 当行缺失时,使用前一行的值来聚合值

java - 用于匹配列表中包含两个不同单词的所有字符串的正则表达式

computer-science - 联营-简明扼要的描述