Because that's how they work! To create a thread you do one of two things:
- Write a class that extends Thread - Write a class that implements Runnable, and pass an instance of that to a Thread object (via its constructor)
In the second case, you have to implement run() because it's part of the Runnable interface. In the first case, you don't have to override run(), but your thread won't do anything - without it you'd just get a new thread that exits immediately.
This is what is happening: when a thread is started it executes the run() method of the Thread object. The default implementation of this runs the run() method of any Runnable you've passed in. So that's where you have to put whatever code you want performing.