Thread - join()

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

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 ?

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…

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.

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:

[code]
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");
	}
}

}[/code]