Deluxe, pelo que lembro de Threads não temos garantia na ordem em que elas irão executar, o que podemos fazer é influenciar o agendador de Threads um exemplo é o metodo estático “sleep()”, mas mesmo com este metodo não temos garantia que as threads irão executar em uma ordem especifica, a unica garantia que temos é que a thread irá ficar em suspensão por algum tempo.
Se vc executar este exemplo que tu listou ai mais vezes você irá ver que a cada momento ele realiza uma saída, talvés você na veja, faz o seguinte aumenta o numero 2 de seu FOR para 500 e roda ele várias vezes para você ver que a cada momento ele tem uma saída.
Vai um exemplo, tenho Thread1 e Thread2, no momento que coloco a Thread1 em suspensão eu não tenho garantia que a Thread2 vai para o estado de execução, caso Thread2 vá para o estado de execução no momento que eu colocar ela no estado de suspensão eu não tenho garantia que a Thread1 que voltou para o estado executável irá entrar no estado de execução, assim a Thread2 pode sair do estado de suspensão e voltar para o estado de executável e selecionada novamente pelo agendador de threads para entrar em execução.
No caso utiliza prioridades e o metodo estático “yield()”, neste caso a intenção é dar chances para todas as threads com mesma prioridade serem executadas, mas este comportamento também não é garantido.
Pessoal caso eu esteja errado me corrijam.