¿Cuál es el orden de ejecución de los hilos recién creados en 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();
    }
}

En el código anterior, cuando llamo al arrancador desde main. He creado cuatro nuevos hilos para llamar a una función sincronizada. Sé que el orden de ejecución de los hilos no se puede predecir. A menos que todos esperen un tiempo, para que el primer hilo pueda terminar y salir del bloque sincronizado. En cuyo caso, espero que todos los hilos se mantengan en una cola, así que esperaba la respuesta como
0
1
2
3
Pero constantemente (ejecuté el programa más de 20 veces) estaba obteniendo la salida como
0
3
2
1
Lo que significa que los hilos se mantienen en una pila en lugar de una cola. ¿Por que es esto entonces? Cada respuesta en el resultado de Google dice que es una cola, pero la obtengo como una pila. Me gustaría saber la razón detrás de mantener los hilos en la pila (que es contrario a la intuición) en lugar de hacer cola.

Respuestas a la pregunta(1)

Su respuesta a la pregunta