gpt4 book ai didi

java - 如何用Java解释这个多线程程序的代码输出?

转载 作者:行者123 更新时间:2023-11-30 02:28:25 25 4
gpt4 key购买 nike

我正在研究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();

}
}

我和一些 friend 讨论了这个问题,我得出的结论是输出应该是一团糟。但由于某种原因,编译器总是产生以下输出:

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()的循环开始方法包含大量 sleep (半秒),t1.start() 的输出很有可能(在辅助线程上运行)和 t1.run() (在主线程上运行)将被交错(因为 sleep 有足够的时间让第二个线程在第一个线程 sleep 时获得控制并打印下一个输出)。

如果减少 sleep 时间,您可能会看到不同的输出。

关于java - 如何用Java解释这个多线程程序的代码输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44946730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com