Thread - join()

4 respostas
Quemicles

Pessoal, boa noite.

Estou com dúvida sobre o método join().
Fiz uma classe para testes e não deu certo.
Gostaria de saber o motivo de não ter executado a ThreadA até o final, ou se fiz alguma coisa errada ou se não entendi realmente.

Classe:

public class Threads {
	
	public Threads(){
		initThreads();
	}
	
	public void initThreads(){
		
		ThreadA a = new ThreadA();
		ThreadB b = new ThreadB();
		
		Thread ta = new Thread(a);
		Thread tb = new Thread(b);
		
		ta.start();
		tb.start();
		
		join(ta);
	}
	
	public void join(Thread t){
		try {
			t.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String args[]){
		new Threads();
	}
	
	private class ThreadA implements Runnable{
		@Override
		public void run() {
			for (int i = 0; i < 1000; i++)
				System.out.println("Thread A");
		}
	}
	
	private class ThreadB implements Runnable{
		@Override
		public void run() {
			for (int i = 0; i < 1000; i++)
				System.out.println("Thread B");
		}
	}

}

Resultado (abreviado):

Thread B
...
Thread B
Thread A
Thread B
Thread B
...
Thread B
Thread B
Thread B
Thread A
...
Thread A
Thread A
Thread A
Thread B
Thread B
...
Thread B
Thread B
Thread A
Thread A
...
Thread A
Thread A
Thread B
...
Thread B
Thread B
Thread A
Thread A
...
Thread A
Thread A
Thread B
Thread B
...
Thread B
Thread B
Thread A
...
Thread A
Thread A
Thread B
Thread B
...
Thread B
Thread B
Thread A
...
Thread A
Thread A
Thread B
Thread B
...
Thread B
Thread B
Thread A
Thread A
...
Thread A
Thread A
Thread A
Thread B
Thread B
...
Thread B
Thread B
Thread A
Thread A
...
Thread A
Thread A
Thread A
Thread A
Thread B
Thread B
...
Thread B
Thread B
Thread A
Thread A
...
Thread A
Thread A
Thread B
Thread B
...
Thread B
Thread B
Thread A
Thread A
...
Thread A
Thread A

4 Respostas

Quemicles

Opa, acho que já sei, deveria chamar o join() antes, desta forma:

ta.start(); join(ta); tb.start();

Mas então qual o motivo de não ter feito o join() da mesma forma depois das threads estarem iniciadas ?

Andre_Fonseca

oi, de uma lida neste topico e veja se ajuda…

ah, estava vendo a forma como voce chamou o método join, está errado, o correto é minhaThread.join() alem das opções passando milisegundos e nanosegundos…

ViniGodoy

Acho que o problema é que você está enxergando só 2 threads, quando na verdade você tem 3.

Você tem:

a) A Main Thread. Disparada pelo java automaticamente, que é quem entra no main.
b) A thread a: Criada por você;
c) A thread b: Também criada por você.

Quem está esperando pela thread a é a main thread, não a thread b. a e b estão rodando paralelamente.

Quando você alterou a forma do join, você fez a main thread esperar pela thread a, antes de disparar a thread b.

Quemicles

Ahh, claro, não estava compreendendo porque não estava visualizando o contexto da thread. hehe.
Obrigado ViniGodoy e André Fonseca.

A forma como deveria ser:

public class Threads {
	
	private ThreadA a;
	private ThreadB b;
	private Thread ta;
	private Thread tb;
	
	public Threads(){
		
		a = new ThreadA();
		b = new ThreadB();
		ta = new Thread(a);
		tb = new Thread(b);
		
		initThreads();
	}
	
	public void initThreads(){
		
		ta.start();
		tb.start();
	}
	
	public void join(Thread t){
		try {
			t.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String args[]){
		new Threads();
	}
	
	private class ThreadA implements Runnable{
		@Override
		public void run() {
			for (int i = 0; i < 1000; i++)
				System.out.println("Thread A");
		}
	}
	
	private class ThreadB implements Runnable{
		@Override
		public void run() {
			
			join(ta);
			
			for (int i = 0; i < 1000; i++)
				System.out.println("Thread B");
		}
	}

}
Criado 29 de dezembro de 2009
Ultima resposta 30 de dez. de 2009
Respostas 4
Participantes 3