多线程-静态代理的方式 - 实现Runnable接口

在看这个小列子之前  

建议大家 最好 先理解一下 静态代理的概念.

http://blog.csdn.net/makemeasmile/article/details/55667574


其实我们的多线程 以实现 Runnable 接口的形式 这种方式  就是采用了我们的 静态代理模式

启用多线程步奏:

1)、真实角色  -  这个角色 就是你要去做的事情

2)、代理角色 -  这个同样也是已经提供好的 代理类 Thread类 

3)、有共同的接口- 这个接口当然是jdk已经提供好的 Runnable 接口

4)、代理角色持有 被代理 对象

5)、代理对象.start 方法 启用线程


推荐使用 实现Runnable 接口的方式 实现多线程,而不使用继承 Thread 的方式

1、避免单继承  (如果使用继承Thread方式,无法在继承其他类)

2、便于 共享资源   ---  看下面的列子  web12306 就是一个真实对象  也是共享的资源 大家都来抢他

按照以上步奏

 // 创建真实角色 

public class Web12306 implements Runnable{    / /真实角色


private int num =50;// 一共有50票的资源 

@Override 
public void run() {
while(true){
if(num<=0){
break;
}
System.out.println(Thread.currentThread().getName()+"抢到了第"+ num--+"张票");
}
}

public static void main(String[] args) {
//声明真实的对象实例
Web12306 web = new Web12306(); // 就这一个真实对象 所有代理都对这一个资源争抢运行 
//代理对象
Thread thread1 = new Thread(web, "路人甲");
Thread thread2 = new Thread(web, "黄牛乙");
Thread thread3 = new Thread(web, "学生丙");
thread1.start();
thread2.start(); 
thread3.start();
}

}

运行结果:

路人甲抢到了第50张票
路人甲抢到了第47张票
学生丙抢到了第48张票
黄牛乙抢到了第49张票
学生丙抢到了第45张票
黄牛乙抢到了第44张票
路人甲抢到了第46张票
黄牛乙抢到了第42张票
学生丙抢到了第43张票
学生丙抢到了第39张票
黄牛乙抢到了第40张票
路人甲抢到了第41张票
黄牛乙抢到了第37张票
学生丙抢到了第38张票
黄牛乙抢到了第35张票
路人甲抢到了第36张票
黄牛乙抢到了第33张票
学生丙抢到了第34张票
黄牛乙抢到了第31张票
路人甲抢到了第32张票
黄牛乙抢到了第29张票
学生丙抢到了第30张票
黄牛乙抢到了第27张票
路人甲抢到了第28张票
黄牛乙抢到了第25张票
学生丙抢到了第26张票
黄牛乙抢到了第23张票
黄牛乙抢到了第21张票
黄牛乙抢到了第20张票
路人甲抢到了第24张票
黄牛乙抢到了第19张票
学生丙抢到了第22张票
黄牛乙抢到了第17张票
路人甲抢到了第18张票
黄牛乙抢到了第15张票
学生丙抢到了第16张票
黄牛乙抢到了第13张票
路人甲抢到了第14张票
黄牛乙抢到了第11张票
学生丙抢到了第12张票
黄牛乙抢到了第9张票
路人甲抢到了第10张票
黄牛乙抢到了第7张票
学生丙抢到了第8张票
黄牛乙抢到了第5张票
路人甲抢到了第6张票
黄牛乙抢到了第3张票
黄牛乙抢到了第1张票
学生丙抢到了第4张票
路人甲抢到了第2张票

总结:

启用线程两种方式:

 1、继承Thread 类,重新run方法 ,然后对象.start 启动

2、实现 Runnable 接口, run方法

  启动采用静态代理的模式:

   1、创建真实角色

   2、创建代理对象 (Thread 持有 真实角色 引用)

   3、代理对象.start 启动


推荐使用 实现  Runnable 接口---  避免单继承局限性  -- 便于共享资源 


你可能感兴趣的:(Java-多线程)