1. Расширяя интерфейс потока, вы заставляете свой класс вести себя только как поток. Ваш новый класс будет как расширенный поток.
jshell> public class Test extends Thread{
...> public Test(String name){
...> super(name);
...> }
...> public void run(){
...> System.out.println(Thread.currentThread().getName());
...> }
...> }
| created class Test
jshell> Test t1=new Test("MyThread");
t1 ==> Thread[MyThread,5,main]
Создает поток, а не объект Test. Так что это будет действовать как единый поток.
Вы не можете разделить экземпляр класса Test между потоками.
2. Реализация работоспособного интерфейса.
jshell> public class Test1 implements Runnable{
...> public void run(){
...> System.out.println(Thread.currentThread().getName());
...> }
...> public String getName(){
...> return "testing";}
...> }
| created class Test1
jshell> Test1 t1=new Test1();
t1 ==> Test1@396a51ab --> this creates Test1 object.
Этот объект может быть разделен между потоками,
jshell> Thread t1=new Thread(t1,"Hai");
t ==> Thread[Hai,5,main]
jshell> Thread t=new Thread(t1,"Hai");
t ==> Thread[Hai,5,main]
Я думаю, что уже много обсуждалось по этой теме.
хотя это может быть полезно в основах.