Dúvida em Threads

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 :wink: