继承Thread类
步骤:
- 先明确我们需要把什么事情[功能]封装成一个线程对象(现有相应的代码)
- 自定义一个类 extends Thread[根据功能数量决定,线程类的数量]
- 覆写run方法,在这里写1步中的代码
- 创建一个自定义类的对象 t
- 启动线程 t.start();
注意执行过程:本质是代码执行到一个位置之后,如果切换到另一个线程,在切换回来,那么会从刚才切换走的代码位置继续执行:产生线程安全问题的原因,就在此..
public class Ticked extends Thread{ static int num=50;//表示票池 @Override public void run() { while(num>0){//循环 System.out.println("卖的第"+num+"张票"); num--; } } } class Test { public static void main(String[] args) { //创建3个线程对象 Ticked ticked1 = new Ticked(); Ticked ticked2 = new Ticked(); Ticked ticked3 = new Ticked(); //启动3个线程 ticked1.start(); ticked2.start(); ticked3.start(); } }
实现Runnable接口
步骤:
- 明确线程主体(自己需要实现的代码);
- 自定义一个类实现Runnable接口
- 覆写run方法 : 写第一步中的代码
- 创建一个自定义类的对象 t
- 以t为参数来构造一个Thread对象 tt;
Thread tt = new Thread(tt);
6.tt.start();//启动线程对象tt,对线程对象t的主体代码进行访问
public class Ticked implements Runnable{
static int num=50;
@Override
public void run() {
while(num>0){//循环检测是否有票,卖完
System.out.println("卖的第"+num+"张票");
num--;
}
}
}
class Test {
public static void main(String[] args) {
Ticked t = new Ticked();
Thread tt = new Thread(t);
tt.start();
}
}
区别
- 继承有局限,Java中类只能够单继承
- 实现的方式,我们的类在业务上可以继承它本应该有的类,同时可以实现接口变成一个线程类,并且可以多实现,大大提高了拓展性。
- 关于数据共享的问题:就看所谓被共享的数据所在的类的对象被创建了几个