You can only meaningfully call join() on a thread that has already been started. join() waits for the thread to finish, and then returns. Calling it before a thread even starts is obviously not going to work. If it did work -- i.e., if it didn't return until the thread was finished -- then you'd never get to the next statement to call start(), right? So the thread would never run at all.