先来看看两种方式如何实现的:
一.继承Thread类实现多线程
1.自定义线程类去继承Thread类实现其run方法
public class MyThread extends Thread{
@Override
public void run() {
for (int i = 0;i<100;i++){
System.out.println(getName() + "=" + i);
}
}
}
2.测试类中创建自定义类对象,调用其start()方法开启线程测试即可
public class ThreadTest {
public static void main(String[] args) {
MyThread t1 = new MyThread();
MyThread t2 = new MyThread();
t1.setName("线程1");
t2.setName("线程2");
t1.start();
t2.start();
}
}
二.实现Runnable接口实现多线程
1.自定义线程类去实现Runnable接口实现其run方法
public class MyRunnable implements Runnable{
@Override
public void run() {
for (int i = 0;i<100;i++){
System.out.println("线程输出"+i);
}
}
}
2.测试类中创建接口类型的自定义类对象,利用Thread类的构造方法将子类对象传递
public class RunnableTest {
public static void main(String[] args) {
//创建自定义接口对象
Runnable runnable = new MyRunnable();
//将 Runnable 接口的子类对象作为参数传递给 Thread 类的构造函数
Thread t1 = new Thread(runnable);
Thread t2 = new Thread(runnable);
//开始线程
t1.start();
t2.start();
}
}
从以上两种实现方法可以看得出,两种方式都需要重写run()方法,创建Thead类对象,调用其start方法来开启线程。
但实现Runnable接口较于继承Thread类有以下几点好处:
1. 避免了继承Thread类具有单继承的局限性,符合面向对象思想。
2. 避免了创建Thread子类对象,既有线程对象,又有线程任务的缺点。
3. 实现runnable接口将线程任务单独分离出来封装成对象,类型就是Runnable接口类型,实现了线程对象与线程任务的解耦合。
所以我们一般采用实现Runnable接口的方式来完成多线程操作。