El problema que describes es generico, asi que cambiando de lenguaje no se va a a solucionar.
Se soluciona es con un entendimiento mas completo de lo que son threads:
http://www.pergolesi.demon.co.uk/prog/threads/ToC.html
http://delphi.about.com/od/kbthread/
http://www.midnightbeach.com/jon/pub.../MsgWaits.html
Pero como aprenderas rapido, la programacion de threads es de locos. La verdad no se ha llegado a una solucione completamente clara pero si hay ya concenso en como hacer las cosas.
La forma mas estable (la tradicional es usar WaitFor) es aprovecharse de las API de mensajes (asi como los que usan los controles de windows!). La idea es que se llama mensajes y un evento "escucha" cuando le llega el mensaje de que el thread X ya se completo, y espera a los otros. Es muy facil de programar.
Pero en definitiva, mejor lee largo y tendido sobre el tema, para que veas la luz