Каков порядок выполнения вновь созданных потоков в 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 говорит, что это очередь, но я получаю ее в виде стека. Я хотел бы знать причину удержания потоков в стеке (что противоречит интуиции) вместо очереди?