案例:存在50个香蕉,现在有请三个童鞋(小A,小B,小C)上台表演吃苹果。因为A,B,C三个人可以同时吃香蕉,此时得使用多线程技术来实现这个案例。
分析: 可以定义三个线程对象,并启动线程.每一个同学吃香蕉的时候: 先展示自己拿到手上香蕉的编号,如1,2,3,… 再吃掉香蕉(意味着苹果的总数少一个)
方式1:可以使用继承Thread方式来实现
/**
* @Auther: guguda
* @Date: 2019/4/18 21:02
* @Description:
*/
class EatBanana1 extends Thread {
//设置香蕉的总数为50
private int num = 50;
public EatBanana1(String name){
super(name);
}
@Override
public void run() {
for (int i = 0; i < 50; i++) {
if(num>0){
System.out.println(super.getName()+"吃了编号为"+num+"的香蕉");
num--;
}
}
}
}
public class EatBanana {
public static void main(String[] args) {
EatBanana1 eatBanana1 = new EatBanana1("A");
EatBanana1 eatBanana2 = new EatBanana1("B");
eatBanana1.start();
eatBanana2.start();
}
}
A吃了编号为46的香蕉
B吃了编号为39的香蕉
A吃了编号为45的香蕉
B吃了编号为38的香蕉
A吃了编号为44的香蕉
B吃了编号为37的香蕉
每个人都消费了50个香蕉
方式二:可以用Runnable实现
代码如下
/**
* @Auther: guguda
* @Date: 2019/4/18 22:05
* @Description:
*/
class Banana implements Runnable{
private int num =50;
@Override
public void run() {
for (int i = 0; i < 50; i++) {
if(num > 0){
System.out.println(Thread.currentThread().getName()+"吃了编号为"+num+"的香蕉");
num--;
}
}
}
}
public class ImplementBanana {
public static void main(String[] args) {
Banana banana = new Banana();
new Thread(banana,"aa").start();
new Thread(banana,"bb").start();
new Thread(banana,"cc").start();
}
}
继承方式:
1):Java中类是单继承的,如果继承了Thread了,该类就不能再有其他的直接父类了.
2):从操作上分析,继承方式更简单,获取线程名字也简单.(操作上,更简单)
3):从多线程共享同一个资源上分析,继承方式不能做到.
实现方式:
1):Java中类可以多实现接口,此时该类还可以继承其他类,并且还可以实现其他接口(设计上,更优雅).
2):从操作上分析,实现方式稍微复杂点,获取线程名字也比较复杂,得使用Thread.currentThread()来获取当前线程的引用.
3):从多线程共享同一个资源上分析,实现方式可以做到(是否共享同一个资源),在这里三个同学完成抢苹果的例子的使用实现方式才合理。