publicclassMyRunnableimplementsRunnable{publicvoidrun(){go();}publicvoidgo(){doMore();}publicvoiddoMore(){System.out.println("top o' the stack");}}
E …
classThreadTestDrive{publicstaticvoidmain(String[]args){RunnablethreadJob=newMyRunnable();ThreadmyThread=newThread(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.
davidtiagoconceicao
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.
W
windsofhell
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:
classThreadTestDrive{publicstaticvoidmain(String[]args){RunnablethreadJob=newMyRunnable();ThreadmyThread=newThread(threadJob);myThread.start().join();System.out.println("back in main");}}
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
publicclassMyRunnableimplementsRunnable{publicvoidrun(){System.out.println("going");go();System.out.println("gone");}publicvoidgo(){System.out.println("doin' more");doMore();System.out.println("done");}publicvoiddoMore(){System.out.println("top o' the stack");}}
classThreadTestDrive{publicstaticvoidmain(String[]args){RunnablethreadJob=newMyRunnable();ThreadmyThread=newThread(threadJob);myThread.start();System.out.println("back in main");System.out.println("still in main");System.out.println("main once more");}}