[Resolvido]-Threads: problema na exibição do menu após execução das threads

Senhores(a), boa noite.
Estou fazendo uma pequena aplicação cujo objetivo é ler de um arquivo alguns dados e alimentar uma lista usando threads.

Para tanto, coloquei o arquivo file para ser a região crítica.

[code]
public void readWrite(String nome, int quantLeitura) {

	synchronized (file) { } [/code]

O problema é quando executo o menu principal:

do {
			System.out.println("1.IMPORTAR ARQUIVO 2.CADASTRAR ALUNOS 3.SAIR");
			opcao = ler.nextInt();

			if (opcao == 1) {
				a = new Guiche("JOÃO ");
				b = new Guiche("PEDRO ");
				c = new Guiche("THIAGO ");
				a.start();
				b.start();
				c.start();

			}
		if (opcao == 2) {
				// em desenvolvimento

			}

		} while (opcao != 3);

Ele executa as threads e não volta a exibir o menu,pois ele mostra novamente antes de executar as threads.
Ex:
Na primeira execução ele exibe:

1.IMPORTAR ARQUIVO 2.CADASTRAR ALUNOS

Depois escolho a opção 1 e veja o que acontece:

1.IMPORTAR ARQUIVO 2.CADASTRAR ALUNOS //exibe novamente o menu (deveria ser no final da execução das threads)
JOÃO  está em processo de leitura ..........
JOÃO  leu MARCOS
JOÃO  agora está em processo de escrita..........
JOÃO  gravou MARCOS na lista
*****************************************************
JOÃO  está em processo de leitura ..........
JOÃO  leu JOAO
JOÃO  agora está em processo de escrita..........
JOÃO  gravou JOAO na lista
*****************************************************
JOÃO  está em processo de leitura ..........
JOÃO  leu CARLOS
JOÃO  agora está em processo de escrita..........
JOÃO  gravou CARLOS na lista
*****************************************************
THIAGO  está em processo de leitura ..........
THIAGO  leu JOAQUIM
THIAGO  agora está em processo de escrita..........
THIAGO  gravou JOAQUIM na lista
*****************************************************
THIAGO  está em processo de leitura ..........
THIAGO  leu MARIA
THIAGO  agora está em processo de escrita..........
THIAGO  gravou MARIA na lista
*****************************************************
THIAGO  está em processo de leitura ..........
THIAGO  leu OLGA
THIAGO  agora está em processo de escrita..........
THIAGO  gravou OLGA na lista
*****************************************************
PEDRO  está em processo de leitura ..........
PEDRO  leu caLEBE
PEDRO  agora está em processo de escrita..........
PEDRO  gravou caLEBE na lista
*****************************************************
PEDRO  está em processo de leitura ..........
PEDRO  identificou que todos dados foram lidos 

// fim da execução das threads.(O menu deveria ser impresso aqui).O sistema fica aguardando uma entrada.Se eu digito 1, ele executa novamente as threads

Minha dúvida é :
Existe alguma forma de contornar esse problema?
A única forma que imaginei seria ir no local onde as threads estão sendo executadas e ao fim(linha trinta e oito) chamar a classe principal para exibir novamente o menu,mas não seria uma forma elegante.
Por exemplo:

PEDRO  está em processo de leitura ..........
PEDRO  identificou que todos dados foram lidos 
String args[]=null;
Principal.main(args);

Desde já, agradeço aos que puderem me ajudar.
Bom início de semana a todos!

Faça:

a = new Guiche("JOÃO "); b = new Guiche("PEDRO "); c = new Guiche("THIAGO "); a.start(); b.start(); c.start(); a.join(); b.join(); c.join();

O join() vai esperar a thread terminar. Sò cuidado para não colocar uma sequencia de start() seguida de join(), pois aí vc vai disparar uma thread de cada vez.

[code] //Errado, dispara uma thread de cada vez.
a.start();
a.join();

b.start();
b.join();

c.start();
c.join();
[/code]

ViniGodoy ,
muito obrigado.
Abraços.