If I am not wrong, it's more or less similar to
What is the difference between an interface and abstract class?
extends establishes "Is A" relation & interface provides "Has a" capability.
Prefer implements Runnable :
- If you don't have to extend Thread class and modify Thread API default implementation
- If you are executing a fire and forget command
- If You are already extending another class
Prefer "extends Thread" :
- If you have to override any of these Thread methods as listed in oracle documentation page
Generally you don't need to override Thread behaviour. So implements Runnable is preferred for most of the times.
On a different note, using advanced ExecutorService
or ThreadPoolExecutorService
API provides more flexibility and control.
Have a look at this SE Question: