操作系统何时在多线程程序中切换线程?

时间:2014-03-19 15:48:56

标签: 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&#39; s,然后在某些时候我得到了这个:

1
1
1
2
1
2
2
2
2
2

为什么会这样?操作系统何时切换线程?

据我所知,for loops无法同时运行(至少不能与单核处理器一起运行)。这让我想知道触发操作系统的原因是什么?

2 个答案:

答案 0 :(得分:4)

线程切换

  • <强>为什么吗

    处于活动状态的每个线程应该彼此并行运行(从程序员的角度来看)。然而,由于核心没有限制,因此不实用。因此,处理器支持的许多线程可以并行运行。在四核处理器中,你的两个线程实际上是并行运行的,但是10个线程不会。为了创建并行执行的假象,必须定期进行线程切换。

  • :当吗

    没有人可以回答这个问题。它实际上取决于JRE实现,底层硬件功能和无数其他因素(如加载其他正在运行的软件)。在这种情况下,操作系统也很重要。程序员认为这是不可预测的(我们不应该假设或依赖订单和切换时间)。

  • 如何查看?

    您用于检查执行顺序的当前方法是错误的。这里,正在使用一个共享对象System.out,它被每个线程缓存(希望),并且输出将与实际内存和io同步,而不管实际的执行顺序如何。它可能在单个核心处理器上有意义,但仅限于某些实现。


我们使用java来获得平台独立性(主要是),这是一个非常难以预测的事情,它依赖于我们甚至无法列出的众多参数。 (如果你创建一个,它将被下一个java更新(可能)过时,并且它对于所有平台都不一样)。所以我建议你假设(就编写Java程序而言)它们将被并行执行。

出于学术目的,如果您要搜索和研究更多有关它的话,这真的是一个有趣的话题。如果您发现有趣的事情,请告诉我们。 :)

希望这会有所帮助..
干杯

答案 1 :(得分:2)

您现在没有使用线程。 如果你调用yourThread.run(),你只需调用方法运行... 你需要的是调用yourThread.start()。这将启动线程。线程将自己执行run方法。