在java中执行新创建的线程的顺序是什么

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(); } } 

在上面的代码中,当我从main调用starter时。 我创建了四个新线程来调用同步函数。 我知道无法预测线程的执行顺序。 除非它们都等待一段时间,否则第一个线程可以完成并从同步块中退出。 在这种情况下,我希望所有线程都保存在队列中,所以我希望答案为
0
1
2
3
但始终如一(我运行程序超过20次)我得到的输出为
0
3
2
1
这意味着线程被保存在堆栈而不是队列中。 为什么会这样? 谷歌搜索结果中的每个答案都说它是一个队列,但我把它作为一个堆栈。 我想知道将线程保持在堆栈中的原因(这是反直觉的)而不是队列?

线程启动的顺序取决于操作系统,它未在Java语言规范中指定。 你在主线程中调用start,但是当新线程被分配并且当它开始处理它的Runnable或run方法时,由OS的调度程序来决定。

注意不要依赖线程发生的顺序。