需求:简单的卖票程序
多个窗口同时卖票
一、创建线程的第二种方式:实现Runnable接口
步骤:
1.定义类实现Runable接口
2.覆盖Runable接口中的run方法
将线程要运行的代码存放在run方法中
3.通过Thread类建立线程对象
4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数
为什么要将Runnable接口的子类对象传递给Thread的构造函数?
因为:自定义的run方法所属的对象是Runnable接口的子类对象
所以要让线程去指定对象的run方法。就必须明确run方法所属的对象
5.调用Thread类的start方法开启线程并调用Runable接口子类的run方法
二、实现方式和继承方式有什么区别?
实现方式避免了单继承的局限性。
在定义线程时,建议使用实现方式
通过一个例子方便理解
学生类中有被多线程所执行的代码,即run方法,那么它可以继承Thread类,来实现学生类多线程
但是,有时可能对学生和工人进行提取,形成他们的父类Person类,当学生中有多线程代码run方法时,
并不能继承Thread类(java中只支持单继承),所以这时,就得通过实现接口来实现多线程,此时,
这个学生类既可以继承父类,也可以实现接口
三、两种方式的区别:
继承Thread:线程代码存放在Thread子类的run方法中
实现Runable:线程代码存放在接口的子类的run方法中
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();
}
}