总结: 一对一的继承,一对多的实现。
类A继承Thread;类B实现Runnable;
继承逻辑:newA,new出的多个A是独立的线程,不能共享A中的变量。
实现接口逻辑:
1. newB得到b对象;
2. new Thread(b)多次得到的多个t_b对象可以共享B中的变量。
用法:多个线程分别完成不同的任务用继承,多个线程完成同一个任务用实现。
继承Thread:
package duoxiancheng;
/**
* 继承Thread类实现多线程,相当于拿出三件事
* 即三个卖早餐5份的任务分别分给三个窗口;
*/
public class MyThread1 extends Thread {
private int breakfast=5;
private String name;
public MyThread1(String name){
this.name=name;
}
public void run(){
for(int i =0;i<5;i++){
if(this.breakfast>0){
System.out.println(this.name+"卖早餐---->"+(this.breakfast--));
}
}
}
public static void main(String[] args) {
/**
* 继承Thread类实现多线程, (一对一)
* mt1、mt2、mt3是三个不同的线程。
*/
MyThread1 mt1= new MyThread1("一号窗口");
MyThread1 mt2= new MyThread1("二号窗口");
MyThread1 mt3= new MyThread1("三号窗口");
mt1.start();
mt2.start();
mt3.start();
}
}
打印结果:
一号窗口卖早餐---->5
一号窗口卖早餐---->4
一号窗口卖早餐---->3
一号窗口卖早餐---->2
一号窗口卖早餐---->1
三号窗口卖早餐---->5
三号窗口卖早餐---->4
三号窗口卖早餐---->3
三号窗口卖早餐---->2
三号窗口卖早餐---->1
二号窗口卖早餐---->5
二号窗口卖早餐---->4
二号窗口卖早餐---->3
二号窗口卖早餐---->2
二号窗口卖早餐---->1
-------------------------------------------
实现Runnable:
package duoxiancheng;
/**
*
* 实现Runnable, 拿出一个卖5份早餐的任务给三个人去共同完成。
* 创建三个线程即安排三个窗口去执行。
*/
public class MyThread2 implements Runnable{
private int breakfast =5;
private String name;
public void run(){
for(int i =0;i<5;i++){
if(this.breakfast>0){
System.out.println(Thread.currentThread().getName()+"卖早餐---->"+(this.breakfast--));
}
}
}
public static void main(String[] args) {
/**
* 实现Runnable,newMyThread2 是创建一个任务
*/
MyThread2 mt = new MyThread2();
/**
* 然后实例化三个Thread (一对多)
*/
Thread t1 = new Thread(mt,"一号窗口");
Thread t2 = new Thread(mt,"二号窗口");
Thread t3 = new Thread(mt,"三号窗口");
t1.start();
t2.start();
t3.start();
}
}
打印结果:
一号窗口卖早餐---->5
三号窗口卖早餐---->3
三号窗口卖早餐---->2
二号窗口卖早餐---->4
一号窗口卖早餐---->1