1.线程与进程的概念与区别
线程是轻量级的进程,线程是进程中的多条路径;
进程比较占用内存,线程是不同的执行路径;
mian 方法也是一个线程 我们把他称为主线程;
2.多线程的模拟(龟兔赛跑的例子)
创建多线程:
1、创建多线程 继承 Thread +重写run(线程体)
2、使用线程: 创建子类对象 + 对象.start() 线程启动
package Creat; /** * * 我们来使用多线程来模拟龟兔赛跑的过程 * * 1、创建多线程 继承 Thread +重写run(线程体) * 2、使用线程: 创建子类对象 + 对象.start() 线程启动 * * @author Wang * */ public class Rabbit extends Thread{ public void run() {//重写Thread中的run() 方法 这里就是线程体 for(int i=0;i<10;i++) { System.out.println("兔子跑了" + i + "步" ); } } } class Tortoise extends Thread{ public void run() { for(int i=0;i<10;i++) { System.out.println("乌龟跑了" + i + "步"); } } }
package Creat; /** * * 对龟兔赛跑类的应用 * 1、创建多线程 继承 Thread +重写run(线程体) * 2、使用线程: 创建子类对象 + 对象.start() 线程启动 * * @author Wang * */ public class RabbitApply { public static void main(String[] args) { Rabbit rab = new Rabbit(); Tortoise tor = new Tortoise(); tor.start();//这样就等于创建了多线程 创建了两条赛道 加上main() 这个主线程那么就是三个赛到了 rab.start(); // 启动多线程是调用start方法而不能调用run()方法 for(int i=0;i<10;i++) {//这样就是三个线程同时运行了 System.out.println("main走了" + i + "步"); } } }
我们的多线程体现在他们跑的时候是同时跑的 如果不是多线程的话 那么就是一个跑完 一个再跑;
3.静态代理设计模式:
package StaticProxy; /** * * 静态代理的设计模式 * 1、要有真实角色 * 2、要有代理角色: 持有真实角色的引用 * 3、二者 实现相同的接口 * * 我们用这个设计模式 来模拟婚庆公司来代理猪八戒的婚礼的过程 * * @author Wang * */ public class StaticProxy { public static void main(String[] args) {//我们在这里来对我们的代理模式来进行应用 Pigsy pig = new Pigsy();//创建一个实体对象猪八戒 WeddingCompany com = new WeddingCompany(pig);//创建一个代理对象 把你的实体对象穿进去 去结婚 com.marry();//这样八戒与嫦娥的回力就完善了 结婚的人还是八戒 } } interface Marry{ void marry();//因为是接口 所以这里相当于 public abstract void marry(); } class Pigsy implements Marry {// 我们在这里创建一个实体 供婚庆公司代理用 @Override public void marry() { System.out.println("Pigsy marry with 嫦娥"); } } class WeddingCompany implements Marry{// 这里我们要求代理公司与实体实现同一个接口 private Marry pig;//代理要有实体对象的引用 public WeddingCompany(Marry pig) { this.pig = pig; } private void before() { //代理的作用就是有一些你没有的方法 他来帮你完成 你只需要把自己传进进来就好了 System.out.println("布置猪窝"); } private void after() { System.out.println("闹洞房"); } @Override public void marry() { before(); pig.marry(); after(); } }
其实Thread类也就是一个代理商,就是这个代理商已经为我们写好了;
Thread实现了Runnable这个接口;
我们要使用静态代理设计模式那么我们也只要实现Runnable这个接口,再把我们的实体对象传进去就行了;
这里是另外一种实现多线程的方法;
还有就是要重写一下Runnable这个接口里的run方法;
这里是持有真实对象的引用;
4.使用Runnable来创建多线程(这里用的就是staticProxy的设计模式)
使用它的好处:
1.避免单继承的局限性
2.便于共享资源
两种主要的实现多线程的方法:
package Runnable; /** * * 我们来用多线程来实现抢票的过程 * * @author Wang * */ public class Web implements Runnable{ private int ticketNum = 500; @Override public void run() { while(true) { if(ticketNum<0) { break; } System.out.println(Thread.currentThread().getName() + "抢到了" + ticketNum--); } } public static void main(String[] args) { Web web = new Web();//创建实体对象 Thread thr1 = new Thread(web,"路人甲");//创建四个代理 他们来实现多线程的抢票 Thread thr2 = new Thread(web,"黄牛"); Thread thr3 = new Thread(web,"程序员"); Thread thr4 = new Thread(web,"白领"); thr1.start(); thr4.start(); thr2.start(); thr3.start(); } }