class Test {
boolean isFirstThread = true;
private synchronized void printer(int threadNo) {
if(isFirstThread) {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
isFirstThread = false;
System.out.println(threadNo);
}
public void starter() {
new Thread(){
@Override()
public void run() {
printer(0);
}
}.start();
new Thread(){
@Override()
public void run() {
printer(1);
}
}.start();
new Thread(){
@Override()
public void run() {
printer(2);
}
}.start();
new Thread(){
@Override()
public void run() {
printer(3);
}
}.start();
}
}
在上面的代码中,当我从主函数调用starter时,我创建了四个新线程来调用一个同步函数。我知道线程的执行顺序是无法预测的,除非它们等待一段时间,以便第一个线程可以完成并退出同步块。在这种情况下,我希望所有线程都被保持在队列中,因此我期望答案是
0
1
2
3
但是一致地(我运行程序超过20次)我得到的输出为
0
3
2
1
这意味着线程被保存在堆栈而不是队列中。为什么会这样?谷歌搜索结果中的每个答案都说它是一个队列,但是我却得到了一个堆栈。我想知道将线程保存在堆栈中(这是相反直觉的)而不是队列的原因是什么?