我注意到在以下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
无法同时运行(至少不能与单核处理器一起运行)。这让我想知道触发操作系统的原因是什么?
答案 0 :(得分:4)
<强>为什么吗
处于活动状态的每个线程应该彼此并行运行(从程序员的角度来看)。然而,由于核心没有限制,因此不实用。因此,处理器支持的许多线程可以并行运行。在四核处理器中,你的两个线程实际上是并行运行的,但是10个线程不会。为了创建并行执行的假象,必须定期进行线程切换。
:当吗
没有人可以回答这个问题。它实际上取决于JRE实现,底层硬件功能和无数其他因素(如加载其他正在运行的软件)。在这种情况下,操作系统也很重要。程序员认为这是不可预测的(我们不应该假设或依赖订单和切换时间)。
如何查看?
您用于检查执行顺序的当前方法是错误的。这里,正在使用一个共享对象System.out
,它被每个线程缓存(希望),并且输出将与实际内存和io同步,而不管实际的执行顺序如何。它可能在单个核心处理器上有意义,但仅限于某些实现。
我们使用java来获得平台独立性(主要是),这是一个非常难以预测的事情,它依赖于我们甚至无法列出的众多参数。 (如果你创建一个,它将被下一个java更新(可能)过时,并且它对于所有平台都不一样)。所以我建议你假设(就编写Java程序而言)它们将被并行执行。
出于学术目的,如果您要搜索和研究更多有关它的话,这真的是一个有趣的话题。如果您发现有趣的事情,请告诉我们。 :)
希望这会有所帮助..
干杯
答案 1 :(得分:2)
您现在没有使用线程。 如果你调用yourThread.run(),你只需调用方法运行... 你需要的是调用yourThread.start()。这将启动线程。线程将自己执行run方法。