理解不了其执行顺序,请大牛指点一下
执行顺序就在main函数里面,首先是穿件一个线程,然后调用一个start方法启动线程。此后的代码直到t.join之间是主线程和子线程之间交替执行,其顺序是随机的。多运行几次会得到不同的结果。最后是主线程输出Complete
这个题目输出结果可能是
Started
0
1
2
3
Complete
也有可能是这样的
0
1
2
3
Started
Complete
因为java中的线程是和底层操作系统有关的,而且几乎不能控制。t.start();这句只是开启线程,不保证线程走到那里,都继续往下走。结果就出现了
Started
0
1
2
3
Complete
这里强调是线程开启,不保证走到哪里。如果开启调试模式,断点调试,结果就是
0
1
2
3
Started
Complete
当t.start();走完了(这里时间几乎没有,总之比单步调试快很多倍)。然后走打印“Started”。所以打印结果是和操作系统有关系,但是重点是t.start();只是开启线程,不保证走到那里,理论上是有一个初始化的过程。
started和1,2,3,4之间没有必然的先后顺序,而complete一定在最后输出,
至于started可能的顺序跟cpu类型(多核,内核调度策略)有关
我们需要明确一点:cpu时间片内一般足够执行若干条指令,因此started一般会很快执行到,而t线程因cpu需要初始化线程(初始化线程算一个比较重的操作),因此会执行得比较慢,因此一般会晚于started执行,
但是如果主线程加了sleep的话,就另当别论了,说明线程放弃了cpu的执行权,给了其它的线程就充足的时间,但是这个充足的时间也得看时间片策略,如果t线程中的执行内容过长,超过cpu时间片,那么执行顺序就不确定了
你可以试试循环次数多一点试试,还可以找一台多核CPU的机器执行着试试
在t.join()之前是main线程和t线程谁空闲谁先走, t.join()之后是t线程先走,直到t线程执行结束再执行main线程