1.继承Thread类
public class Demo1 {
public static void main(String[] args) {
myThread mt = new myThread(); //3.创建子类对象
mt.start(); //4.开启线程
for(int i = 0;i<10000;i++) {
System.out.println("bb");
}
}
}
class myThread extends Thread{ //1.类继承Thread类
public void run() { //2.重写run方法
for(int i = 0;i<10000;i++) {
System.out.println("aaaa");
}
}
}
2.实现Runnable接口
public class Demo2 {
public static void main(String[] args) {
myThread02 mt = new myThread02(); //3.创建子类对象
Thread t = new Thread(mt); //4.把子类对象当成参数传给Thread
t.start(); //5.开启线程
for(int i = 0;i<10000;i++) {
System.out.println("bb");
}
}
}
class myThread02 implements Runnable{ //1.实现Runnable接口
@Override
public void run() { //2.重写run方法
for(int i = 0;i<10000;i++) {
System.out.println("aaaa");
}
}
}
3.匿名内部类(本质就是前两种)
public class Demo3 {
public static void main(String[] args) {
//创建Thread匿名对象
new Thread() {
public void run() {
for(int i = 0;i<10000;i++) {
System.out.println("aaaa");
}
}
}.start();
//创建Thread匿名对象,传入实现Runnable接口的匿名对象
new Thread(new Runnable() {
public void run() {
for(int i = 0;i<10000;i++) {
System.out.println("bb");
}
}
}).start();
}
}
总结:由于Java是单继承如果已经继承了父类,不能通过继承Thread类来实现多线程,可以通过实现Runnable接口来实现,但这种方法在使用时需要创建Thread类对象(因为Runable没有start()方法,所以需要创建,但是写了更多的带代码),可以把Runnable当成是继承Thread的一个补充,匿名内部类的实现方式最灵活,根据自己的需要选择用哪一种。