A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

实现Runnable接口
使用继承方式有一个弊端,那就是如果该类本来就继承了其他父类,那么就无法通过Thread类来创建线程了,这样就有了第二种创建线程的方式:实现Runnable接口。
步骤:
a, 定义类实现Runnable的接口。
b, 覆盖Runnable接口中的run方法。目的也是为了将线程要运行的代码存放在该run方法中。
c, 通过Thread类创建线程对象。
d, 将Runnable接口的子类对象作为参数传递给Thread类的构造方法。
e, 调用Thread类中start方法启动线程。start方法会自动调用Runnable接口子类的run方法。
实现Runnable接口好处:java是单继承多实现,使用实现Runnable接口的方式避免了单继承的局限性。在定义线程时,建议使用实现Runnable接口方式。
        使用实现Runnable接口的方式实现相同的功能。
/*
* 示例:创建三个线程,每过2秒打印一下线程的名称,共打印三次
* */
class ThreadTestWin implements Runnable{
        private final int MAX = 3;//最大打印次数
        private int COUNT = 1;//计数
        private final int TIME = 2;//间隔时间
        private String NAME;
       
        public ThreadTestWin(String name) {
                this.NAME = name;
        }
        public String getName() {
                return this.NAME;
        }
        //覆盖run方法,在里面写我们要执行的代码
        public void run() {
                while(COUNT<= MAX){
                        System.out.println(this.getName());
                        COUNT++;
                        //每次打印后,在间隔时间后再打印
                        try {
                                Thread.sleep(TIME*1000);
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                }
        }
}

class Thread2{
        public static void main(String[] args) {
                Thread t1 = new Thread(new ThreadTestWin("线程1"));//创建线程
                Thread t2 = new Thread(new ThreadTestWin("线程2"));
                Thread t3 = new Thread(new ThreadTestWin("线程3"));
                t1.start(); //开启线程
                t2.start();
                t3.start();
                //也可以使用下面这种方式书写
                //new Thread(new Thread2("线程4")).start();
        }
}

为什么将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数?
因为要被多线程执行的代码都存放了Runnable接口的子类中,所以必须要明确线程对象要执行的run方法所属的对象。

两种实现方式的区别:
a,继承Thread:线程代码存放在Thread子类run方法中 实现Runnable:线程代码存放在接口子类run方法中。
        b,实现Runnable接口是可以将资源共享。
        c,实现Runnable接口避免了单继承的局限性 。
        所以建议使用实现Runnable接口的方式来创建线程。


1 个回复

正序浏览
大家有不明白的地方可以一起交流
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马