进程_线程的概念_多线程模拟龟兔赛跑和抢票_静态代理设计模式_实现多线程主要的两种方式_day29

时间:2022-12-29 17:06:20

1.线程与进程的概念与区别

进程_线程的概念_多线程模拟龟兔赛跑和抢票_静态代理设计模式_实现多线程主要的两种方式_day29

线程是轻量级的进程,线程是进程中的多条路径;

进程比较占用内存,线程是不同的执行路径;

进程_线程的概念_多线程模拟龟兔赛跑和抢票_静态代理设计模式_实现多线程主要的两种方式_day29

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方法;

进程_线程的概念_多线程模拟龟兔赛跑和抢票_静态代理设计模式_实现多线程主要的两种方式_day29

这里是持有真实对象的引用;

4.使用Runnable来创建多线程(这里用的就是staticProxy的设计模式)

使用它的好处:

1.避免单继承的局限性

2.便于共享资源

两种主要的实现多线程的方法:

进程_线程的概念_多线程模拟龟兔赛跑和抢票_静态代理设计模式_实现多线程主要的两种方式_day29

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();
		
		
	}

}