title: Why is Thread not an abstract class and start() not final?
body: <p>Why was the <code>Thread</code> class implemented as a regular class and not an <strong>abstract</strong> class with <code>run()</code> method being abstract.</p>
  
  <p>Will it possibly introduce any problems? Or does it have any use in being this way?</p>
  
  <p>Also, the <code>Thread.start()</code> method is supposed to be a very specific method <strong>whose functionality cannot be implemented by any other class</strong> (If I am not wrong). And hence I guess the <code>final</code> keyword would be apt for this more than any other method.</p>
  
  <p>But I am able to override this method and use it as I like,</p>
  
  <pre><code>public class Test extends Thread {
      public static void main (String... args) {
          Thread test = new Test();
          test.start();
      }
  
      @Override
      public void run() {
          System.out.println("New thread started...");
      }
  
      @Override
      public void start() {
          System.out.println("Did anyone tell you I will spawn a new thread??");
      }
  }
  </code></pre>
  
  <p>It obviously only printed,</p>
  
  <blockquote>
    <p>Did anyone tell you I will spawn a new thread??</p>
  </blockquote>
  
  <p>Is there any use in overriding other than confusing the engineer replacing you?</p>
  
  <p>If not, why was the method not declared final in Thread class?</p>