Saudações Javaneses?!
Estou com o seguinte código:
public class MyRunnable implements Runnable
{
public void run()
{
go();
}
public void go()
{
doMore();
}
public void doMore()
{
System.out.println("top o' the stack");
}
}
E …
class ThreadTestDrive
{
public static void main(String[] args)
{
Runnable threadJob = new MyRunnable();
Thread myThread = new Thread(threadJob);
myThread.start();
System.out.println("back in main");
}
}
Tirei este código do livro “Use a Cabeça Java 2º edição”, quando executo este programa dá somente este resultado
java MyRunnable
back in main
top o’ the stack
E no livro diz que se eu executa-lo várias vezes vai aparecer aleatoriamente assim:
java MyRunnable
back in main
top o’ the stack
java MyRunnable
top o’ the stack
back in main
Que não é o meu caso será que houve alguma correção no JDK 1.6?
Por que no meu não aparece aleatoriamente, como no livro?
Acho que o que o livro quis dizer é que a ordem da saída não é garantida, e pode variar de máquina para máquina, talvez a ordem nunca mude na sua máquina.
Isso aí gilmaslima, também entendi a mesma coisa: a ordem em que as linhas serão exibidas na tela não pode ser determinada com precisão, o livro provavelmente queria demonstrar isso.
peresjuliao, você está executando este código em um processador single core? Se sim, a probabilidade de a ordem das linhas não mudar é bem maior. Se puder, tente executar este código em uma máquina multi core/ multi cpu, a probabilidade de as linhas alternarem é maior.
Lembrando que do jeito que esse programa esta escrito eh impossivel terminar o que vai ser executando primeiro.
Se vc modificar o seu programa para algo do tipo:
class ThreadTestDrive
{
public static void main(String[] args)
{
Runnable threadJob = new MyRunnable();
Thread myThread = new Thread(threadJob);
myThread.start().join();
System.out.println("back in main");
}
}
Ai o println vai ser executado somente apos myThread .
Para ler mais sobre o join: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Thread.html#join()
//Daniel
Acredito que (como já foi citado) a intenção do autor foi mostrar que não há ordem garantida de execução.
Entretanto, há de se perceber que existe um micronésimo de segundo de diferença para iniciar a nova thread, e no meio tempo a thread principal ainda está executando. Dependendo da troca de contexto de sua CPU, o resultado pode variar…
Teste o código
public class MyRunnable implements Runnable
{
public void run()
{
System.out.println("going");
go();
System.out.println("gone");
}
public void go()
{
System.out.println("doin' more");
doMore();
System.out.println("done");
}
public void doMore()
{
System.out.println("top o' the stack");
}
}
class ThreadTestDrive
{
public static void main(String[] args)
{
Runnable threadJob = new MyRunnable();
Thread myThread = new Thread(threadJob);
myThread.start();
System.out.println("back in main");
System.out.println("still in main");
System.out.println("main once more");
}
}
Pra ver o resultado 