JavaはCと違って、メインが終了してもサブスレッドがすべて終了するまでプロセスが終わらない。
Thread.setDaemon()である程度制御はできるし、Cと同じにしたければ
mainの最後でSystem.exit()すりゃいいだけ。
そういう言語設計思想なんだからメイン終了時にjoinしろという指摘は不適切。

ちなみにこの仕様はJavaだけでなく.NET Frameworkにも受け継がれている