This is a follow-on question from a recent SCJP topic.
Why is the start method in class Thread not final?
All sorts of problems can arise from overriding start() because the method runs in the context of the calling thread and not in the context of a newly started thread until the "real" Thread start() method is invoked.
It's true that you could override start() and do something useful before or after calling super.start(), but really, I'm sure the reason is that the guys who write Thread didn't think of it. Sun has always been loath to change existing APIs in ways that would break existing user code, and so if this wasn't final originally, they won't make it final now.
The core APIs are full of this kind of stuff. Remember that the java.lang classes are some of the very oldest Java code in existence, and remember how your Java design skills improve with practice over the years!