A solução adotada envolveu semânticamente um objeto observável, isto é, a Thread que é dada join guarda o objeto que deu join como seu observador e na sua saída notifica a thread que deu join.