我正在研究 java 中的多线程并编写了以下代码。
public class MulThread extends Thread
{
public void run()
{
for(int i=1; i<5;i++)
{
try
{
Thread.sleep(500);
}
catch(Exception e){ System.out.println(e);}
System.out.println(i);
}
}
public static void main(String [] args)
{
MulThread t1 = new MulThread();
MulThread t2 = new MulThread();
MulThread t3 = new MulThread();
t1.start();
t1.run();
t2.start();
t2.run();
t3.start();
t3.run();
}
}
我和一些朋友讨论过这个问题,我得出的结论是输出应该是一团糟。但出于某种原因,编译器总是产生以下输出:
1
1
2
2
3
3
4
4
1
1
2
2
3
3
4
4
1
1
2
2
3
3
4
4
有人可以解释当线程到达调度程序时这里到底发生了什么吗?为什么输出不是一团糟的 1、2、3 和 4,每个都在随机汤中重复 6 次?
我的一些导师告诉我这只是巧合,这取决于我的操作系统或其他什么,但我对此持怀疑态度。我已经运行了 10 多次代码,它总是产生相同的结果。
当您调用 时t1.start()
,辅助线程将启动并运行该run()
方法。当您调用 时t1.run()
,您正在run()
主线程上执行该方法。
这意味着t2.start();
只有在t1.run();
完成循环后才会执行,此时创建的线程t1.start()
已经完成。
由于该run()
方法的循环包含一个大的睡眠(半秒),t1.start()
(在辅助线程t1.run()
上运行)和(在主线程上运行)的输出很有可能会交错(因为睡眠是有足够的时间让第二个线程在第一个线程休眠时获得控制权并打印下一个输出)。
如果您减少睡眠时间,您可能会看到不同的输出。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句