多线程的创建
方式二:实现Runable接口
- 创建一个实现了Runnable接口
- 实现类去实现Runnable中的抽象类方法:run()
- 创建实现类的对象
- 将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
- 通过Thread类的对象调用start()
/**
* 多线程的创建:方式二:实现Runable接口
*
* @author ZAQ
* @create 2020-02-05 17:01
*/
//1. 创建一个实现了Runnable接口
class MThread implements Runnable {
// 2. 实现类去实现Runnable中的抽象类方法:run()
@Override
public void run() {
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) {
System.out.println(Thread.currentThread().getName() + ": " + i);
}
}
}
}
public class ThreadTest1 {
public static void main(String[] args) {
//3. 创建实现类的对象
MThread mThread = new MThread();
//4. 将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象
Thread thread = new Thread(mThread);
//5. 通过Thread类的对象调用start() ①:启动线程 ②:调用当前线程run()方法 --> 调用了Runnable类型的target的run()方法
thread.start();//通过源码可知:这里Thread里的run()方法就是调用target的run()方法,而生成对象初始化时将传进来的mThread赋给了targer,
// 所以这里通过thread调用的start方法调用的run()方法就是调用MThread重写的run()方法
//在启动一个线程,遍历100以内的偶数
Thread t2 = new Thread(mThread);
t2.start();
}
}
另一种简单写法:匿名的方式实现Runnable接口
public class ThreadTest {
public static void main(String[] args) {
new Thread(new Runnable() {/*Runnable实现类的匿名对象对象*/
@Override
public void run() {
}
}).start();
}
}
继承于Thread类的创建方法与实现Runable接口的创建方法的对比
开发中:优先选择:实现Runable接口的方式
- 实现的方式没有类的单继承的局限性(继承的Thread方式将没有办法继承其他类,实现的方式还可继承其他类,或其他方法)
- 实现的方式更合适来处理多个线程有共享数据的情况
联系:Thread也是实现Runnable接口
相同点:两种方式都需要重写run(),将线程要执行的逻辑声明在run()中。