先展示两个程序
1用Thread实现
package com.chang.demo01;
//创建线程方式1:继承Thread类,重写run()方法,调用start开启线程
//总结:线程开启不一定立即执行,由CPU调度执行
public class TestThread1 extends Thread{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("我在看代码=="+i);
}
}
public static void main(String[] args) {
//main线程,主线程
//创建一个线程对象
TestThread1 testThread1 = new TestThread1();
//调用start()方法开启线程
testThread1.start();
for (int i = 0; i < 2000; i++) {
System.out.println("我在学习多线程=="+i);
}
}
}
2 用Runnable实现
package com.chang.demo01;
//创建线程方式2:实现runnable接口,重新run方法,执行线程需要丢入runnable接口实现类
public class TestThread3 implements Runnable{
@Override
public void run() {
//run方法线程体
for (int i = 0; i < 20; i++) {
System.out.println("我在看代码=="+i);
}
}
public static void main(String[] args) {
//创建runnable接口的实现类对象
TestThread3 testThread3 = new TestThread3();
//创建线程对象,通过线程对象开启线程
/*
Thread thread = new Thread(testThread3);
thread.start();
*/
new Thread(testThread3).start();//与上面的多行注释等同
for (int i = 0; i < 2000; i++) {
System.out.println("我在学习多线程=="+i);
}
}
}
这两个程序实现的是一样的功能,但是有没有发现这两个程序有什么区别呢?这里更推荐使用第二个程序
3区别
第一段代码
public class TestThread1 extends Thread
第二段代码
public class TestThread3 implements Runnable
第一段代码
TestThread1 testThread1 = new TestThread1();
testThread1.start();
第二段代码
TestThread3 testThread3 = new TestThread3();
new Thread(testThread3).start();
有的人这里可能会问道,感觉第一个继承Thread要简单一些,为什么推荐使用第二个Runnable接口呢?
因为Thread有单继承的局限性,使用Runnnable就可以避免单继承的局限性。