The reasons why you might prefer implementing the Interface Runnable to extending the Class Thread are the following:
- less overhead in a sequencial context (source)
When you extends Thread class, each of your thread creates unique
object and associate with it. When you implements Runnable, it shares
the same object to multiple threads.
Source: a blog - I'm not quite sure if that's correct
- you can send tasks over the network with Runnable (Thread is not serializable, source)
- better OOP-style
- it's very likely that you don't have a "is a" relationship
- you have the possibility to extend other classes (Java has no multiple inheritance)