第一种,继承Thread类,创建一个类,继承 这个类,这个类本质其实也是实现了runable类的一个实例,他代表了一个线程的实例, 调用这个类中的start方法,这个方法是native方法,会调用cpu其他资源 来启动一个线程,且只有调用了这个方法,线程才能得以成功启动 ,启动这个线程之后 ,一般会执行run()方法,这是这个线程需要做的事情
代码如下

public class Mythread extends Thread{
  public void run(){
  System.out.print"Mythread.run"};
}
 如果 想要启动就在你想要的地方
 new出这样一个实例
 Mythread mythread1 = new Mythread();
 mythread .start(); 线程启动成功;	

第二种方式,实现runable接口, 实现run方法,

public class Mythread extends otherclass implments Runable{
run方法
}
我们的目的是启动线程,启动线程就需要Thread中的start愿方法
也就是Thread thread = new Thread("入参")
Mythread mythread = new Mythread();
将这个实现了runable接口的实例传入到入参的位置,也就是将这个实例当作构造方法参数传入进去

q然后thread.start(); 启动了这个线程后,如果 参数不为空,根据源码 可以得到他调用的是run方法,执行我们自己写的业务逻辑

public void run() {
  if (target != null) {
   target.run();
  }






另外 这个类自己就实现了Runable接口
![](https://img2020.cnblogs.com/blog/2063026/202108/2063026-20210807170617179-280141951.png)