Каков порядок выполнения вновь созданных потоков в 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();
    }
}

В приведенном выше коде, когда я звоню стартер с главной. Я создал четыре новых потока для вызова синхронизированной функции. Я знаю, что порядок выполнения потоков не может быть предсказан. Если они все не будут ждать какое-то время, чтобы первый поток мог завершиться и выйти из синхронизированного блока. В этом случае я ожидаю, что все потоки будут находиться в очереди, поэтому я ожидал ответа как
0
1
2
3
Но последовательно (я запускал программу более 20 раз) я получал вывод
0
3
2
1
Это означает, что потоки хранятся в стеке, а не в очереди. Почему это так? Каждый ответ в результатах Google говорит, что это очередь, но я получаю ее в виде стека. Я хотел бы знать причину удержания потоков в стеке (что противоречит интуиции) вместо очереди?

Ответы на вопрос(1)

Ваш ответ на вопрос