I don't use the join() for a fancy algorithm. Sometimes, I pull together a bunch of independent init sequences and the join() is a barrier to continuing. I'm thinking that maybe the join() will bring all the threads together whereas shutdown() was more of a hint to the threads.