1、直接继承Thread并重写run方法,调用Thread中的start方法创建一个新的线程(本质上是调用run方法)
2、实现Runnable接口,并重写接口中的run方法(因为java不支持多重继承,所以第三方库的类如果要开启线程则必须使用该方法创建)
注:经查看源码发现Thread支持构造函数Runnable类的注入,Thread类本身也实现了Runnable的中的run方法,所以经过测试发现Thread中的run方法和start方法一样都会创建一个新的线程(存疑)
测试代码如下:
public class ThreadTest extends Thread{
private int count = 10;
@Override
public void run() {
while (true)
{
System.out.println(count + "");
if(--count == 0)
{
break;
}
}
}
}
public class RunableTest implements Runnable{
private int count = 6;
@Override
public void run() {
while (true)
{
System.out.println(count + "");
if(--count == 0)
{
break;
}
}
}
}
public class Main {
public static void main(String[] args) {
// write your code here
//这两种Thread调用方法调用结果相同
// new ThreadTest().start();
// new ThreadTest().run();
//
//
//这里Runable的调用结果均相同
new RunableTest().run();
Thread thread = new Thread(new RunableTest());
thread.start();
thread.run();
}
}
Thread和Runnable的区别:
1、通过Thread去创建多个线程访问同一个变量时,实际资源是不共享的
2、Runnable方便扩展第三方库的类去创建线程,因为java本质上不支持多继承,这个时候就没法使用Thread去创建线程了
3、Runnable可以增加代码的健壮性
总结:Thread中重写run方法,实际上是重写Runnable接口的run方法。由此可见,Runnable才是最牛的!



