java中创建线程的方式有多少种,这个问题也是众多纷纭,这个时候更应该参考官方文档(https://docs.oracle.com/javase/8/docs/api/java/lang/Thread.html)了,文档很明确地指出两种创建线程的方法.
第一种就是继承Thread类,第二种就是实现Runnable接口,而其他的方法比如Callable也是包装Runnable,本质上还是Runnbale

OK,现在问题来了,继承Thread类好还是继承Runnable接口好,答案很明显,还是继承Runnbale接口更好一些,首先因为语言设计的问题,java只能单继承,如果你继承了Thread类了,就不能继承其他类了,很麻烦,第二点就是Runnable的设计概念更符合计算机科学中“分解”的思维,把任务和线程概念分离出来,减少了创建/销毁线程的开销。

其实,本质上都是Thread的,只不过执行单元有两种实现,可以看run方法的源码
java创建线程的方式有几种?-小白菜博客
可以看出调用run方法的时候会先判断有没有target,而这个target是Runnbable类型的!所以我们在继承Runnable接口的时候要重写run方法,如果是直接继承Thread类就不会进入if里面,或者干脆继承Thread类后也重写个run方法,都不会走这三行代码了