The difference between them is:
1. Reusability: implement Runnable can be reused whenever the user wants to whereas extend Threads is specific in behavior and hence can't be reused.
2. Functions overhead:
We can easily perform a task using implement Runnable without the Threads class functions overhead whereas in extends Threads we need to inherit all the functions of the Thread class which we might not need.
3. Object-Oriented Design:
extends Thread is not a good Object Oriented practice whereas implementing Runnable is preferred as it doesn't specialize or modify the thread behavior.
4. Inheritance Option:
Implementing Runnable gives choice to extend a class we like whereas extends Thread can't support multiple inheritances.
implements Runnable makes the code loosely-coupled and easier to read whereas extend Thread makes the code tightly coupled.