Qual é a ordem de execução dos threads recém-criados em 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();
    }
}

No código acima, quando eu chamo o iniciador do main. Eu criei quatro novos threads para chamar uma função sincronizada. Eu sei que a ordem de execução dos threads não pode ser prevista. A menos que todos esperem algum tempo, para que o primeiro encadeamento possa terminar e sair do bloco sincronizado. Nesse caso, espero que todos os threads sejam mantidos em uma fila, então esperava a resposta como
0
1
2
3
Mas consistentemente (eu executei o programa mais de 20 vezes) eu estava obtendo a saída como
0
3
2
1
O que significa que os encadeamentos estão sendo mantidos em uma pilha em vez de em uma fila. Por que é tão? Todas as respostas no resultado do google dizem que é uma fila, mas estou recebendo como uma pilha. Gostaria de saber o motivo por trás da retenção dos threads na pilha (o que é contra-intuitivo) em vez da fila?

questionAnswers(1)

yourAnswerToTheQuestion