(45)创建线程的第二种方式:实现Runnable接口、两种方式比较

时间:2021-07-21 17:39:19

需求:简单的卖票程序

多个窗口同时卖票

一、创建线程的第二种方式:实现Runnable接口

步骤:

1.定义类实现Runable接口

2.覆盖Runable接口中的run方法

   将线程要运行的代码存放在run方法中

3.通过Thread类建立线程对象

4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数

   为什么要将Runnable接口的子类对象传递给Thread的构造函数?

   因为:自定义的run方法所属的对象是Runnable接口的子类对象

    所以要让线程去指定对象的run方法。就必须明确run方法所属的对象

5.调用Thread类的start方法开启线程并调用Runable接口子类的run方法

二、实现方式和继承方式有什么区别?

实现方式避免了单继承的局限性。

在定义线程时,建议使用实现方式

通过一个例子方便理解

(45)创建线程的第二种方式:实现Runnable接口、两种方式比较

学生类中有被多线程所执行的代码,即run方法,那么它可以继承Thread类,来实现学生类多线程

但是,有时可能对学生和工人进行提取,形成他们的父类Person类,当学生中有多线程代码run方法时,

并不能继承Thread类(java中只支持单继承),所以这时,就得通过实现接口来实现多线程,此时,

这个学生类既可以继承父类,也可以实现接口

三、两种方式的区别:

继承Thread:线程代码存放在Thread子类的run方法中

实现Runable:线程代码存放在接口的子类的run方法中

public class Demo implements Runnable{
    private int tick=10;
    public void run() {
        while(true) {
            if(tick>0) {
                System.out.println(Thread.currentThread().getName()+"sale:"+tick--);
            }
        }
    }
    
}

public class ThreadDemo {

    public static void main(String[] args) {
        Demo d=new Demo();//并不是线程
        Thread t1=new Thread(d);
        Thread t2=new Thread(d);
        Thread t3=new Thread(d);
        Thread t4=new Thread(d);
        t1.start();
        t2.start();
        t3.start();
        t4.start();
}
    }