Pessoal eu to ficando até com vergonha de toda hora ter que fazer um post aqui no guj sobre Thread mas eu acho que eu to aprendendo…Bom a minha duvida é a seguinte. Dado o código abaixo que tava testando…
public MyThread extends Thread {
public void run(){
for(int i = 0 ; i < 4; i++)
System.out.println(i);
}
}
public Principal{
public static void main(String ... rafa){
Thread r = new Thread(new MyThread(), "Rafael");
r.start();
System.out.println("OLA MAIN.....");
}
}
A minha duvida é a seguinte… Eu estou rodando esse codigo e so está print out 0,1,2,3 e depois OLA MAIN eu gostaria de saber se isso é garantido ou não… TIpo eu acho que não é garantido mais vale a pena perguntar para os pessoais feras aqui do GUj valew…
realmente o comportamento nao eh garantido. Os numeros vao sempre sair em sequencia, mas voce nao consegue saber quando o OLA MAIN serah impresso.
Para fazer o teste, tente aumentar o tamanho do for. Voce vai ver que o OLA MAIN vai ser impresso entre os numeros.
E, como eu falei no outro post, não adianta nem mesmo aumentar a prioridade da outra thread.
Continua sem ser garantido.
Também não adianta colocar um sleep no main e imaginar que “com a pausinha vai dar tempo do for terminar”. Pode colocar 1 hora de tempo, que continua não sendo garantido.
Via de regra, nunca confie no escalonador. Quem define que thread entra no processador é ele. E SOs diferentes tem políticas diferentes. Um pode, por exemplo, dar prioridade para a última thread disparada (numa espécie de pilha) e não dar qualquer garantia de starvation (uma thread roubar o processador para si). Outro pode ter um complexo esquema de justiça, timesharing e de quebra controlar vários núcleos, podendo iniciar diversas threads realmente em paralelo.
Você, como desenvolvedor de uma linguagem multiplataforma, nunca sabe. Especialmente agora, com micros tendo múltiplos núcleos e threads podendo efetivamente rodar em paralelo. Sem usar um mecanismo formal de sincronização e espera, nada é garantido.