Método join() da classe Thread [RESOLVIDO]

Olá galera

Estou com uma seguinte dúvida

Quando eu chamo em um código new Thread().start() e logo em seguinda new Thread().join() eu forço a thread que está rodando no momento executar a thread que eu iniciei até o final?

exemplo


public class Teste {

	public static void main(String args[]){
		
		Thread t = new Thread(new Teste().new MyThread());
		System.out.println("Olá");
		
		t.start();
		try{
			t.join();
		}catch(Exception e){
			
		}
		
		for(int i=0; i<1000; i++)
			System.out.println("Olá2");
	
		
	}
	
	class MyThread implements Runnable{

		
		public void run() {
			
			System.out.println("Olá Thread");
			
		}
		
		
	}
	
}

com esse código é GARANTIDO que a mensagem Olá Thread SEMPRE vai ser exibida após a mensagem Olá ?

Ou foi pura coincidência eu rodar o código 10 vezes e as 10 vezes ela ser exibida da mesma maneira, a mensagem Olá Thread exibida logo após a mensagem Olá

Outra dúvida qual o efeito desse código?


public class Teste {

	public static void main(String args[]){
		
		Thread t = new Thread(new Teste().new MyThread());
		System.out.println("Olá");
		
		t.start();
		
		
		for(int i=0; i<1000; i++)
			System.out.println("Olá2");
	
		try{
			t.join();
		}catch(Exception e){
			
		}
	}
	
	class MyThread implements Runnable{

		
		public void run() {
			
			System.out.println("Olá Thread");
			
		}
		
	}

Eu interpreto dessa maneira, quando o controlador de threads começar executar a thread MyThread ele vai executar até o final e só depois a thread principal vai finalizar a sua operação

Estou correto?

Att.

Isso mesmo. O join() faz com que a thread que chamar esse método espere a outra thread acabar.

O segundo código tem o mesmo efeito. Mas muito provavelmente a thread que inicia em MyThread irá terminar antes da thread principal, e o join() portanto não segurará a execução do programa.

Humm entendi

Tipo no primeiro código eu garanto que o thread MyThread vai executar logo que o comando start() for chamado, e vai garantir que a mensagem vai aparecer na segunda linha

E no segundo código eu não tenho essa garantia, porque eu chamo o metódo join() depois?

Entendi, entendi hehe

Muito obrigado vini

Até +

No segundo você também tem essa garantia. Na eventualidade daquele loop terminar antes da thread 2 (o que é bem difícil, pq a thread 2 não tem quase nada), o join() vai segurar a execução.

Entendi

O método join garante que quando o thread estiver sendo executado e o método join for chamado ele “breca” o thread atual que está sendo rodado e começa o thread até o final

A minha dúvida é

No primeiro código eu tenho uma chamada logo em seguinda

t.start();
try{
t.join();
}....

Nesse código eu não garanto que o Thread principal vai entrar em espera logo em seguida que o t.start executar, eu quero saber se é realmente GARANTIDO que não importa a quantidade de dados que eu tiver em MyThread ela vai ser exibida sempre logo após a mensagem “Olá”

Att

Sim, é garantido. Deu o join() a thread atual irá esperar a thread que recebeu o join().

Humm

Obrigado pela ajuda vini =)

Até