从永远到永远-多线程(一)

学习资料:汪文君

1、模板方法

1、代码引入(模板方法)

Thread thread= new Thread(){
			@Override
			public void run(){
				System.out.println("啦啦啦");
			}
		};
		thread.start();

这是一个简单的多线程demo,为什么复写的是run,但是调用的是start()呢,其实有点类似于设计模式中的模板方法。
模板方法模式:定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

//1、模板方法通常是抽象类
public abstract class Template001 {
	//2、提取公共部分 并且通常被final修饰!
	public final void doSomethingInRestaurant(){
		//场景模拟(饭店吃饭 ):
		// 肯定是三个步骤,点餐 、吃饭、付账。但是具体怎么吃的饭却不是一定的
		System.out.println("顾客牙牙开始点餐!");
		this.eat();
		System.out.println("顾客牙牙对象刘德华付账!");
	}
	//3、模板方法通常protected修饰,只暴露给子类,让子类重写此方法,实现具体业务逻辑
	protected void eat(){
		System.out.println("子类重写具体吃饭情况!!!");
	}

	public static void main(String[] args) {
		Template001 template001=new Template001() {
			@Override
			protected void eat() {
				System.out.println("顾客牙牙吃饭:胃口不好,吃了一口菜,一直在玩手机!");
			}
		};
		template001.doSomethingInRestaurant();
	}
}

2、线程基础总结

1、main函数是一个线程,jvm启动的时候调用,名字就是main。
2、实现线成,必须创建Thread实例,重写run方法,并且调用start()。否则,他只是一个Thread实例,不是线程。
3、我们的的线程,调用start(),此时,至少2个线程。包含,调用我们线程的线程。
4、jvm启动后,灰有多个线程,但是至少又一个非守护线程。
5、生命周期(略)

3、runnable接口和策略模式

该部分模拟了银行叫号。

1、Thread类

public class TicketWindow extends Thread{
	private static int index=1;
	private static  final int TOTAL_AMOUNT=50;//使得所有窗口都是针对同一个50
	private final String TICKET_NAME;
	public TicketWindow(String ticket_name) {
		TICKET_NAME = ticket_name;
	}
	@Override
	public  void run(){
		while (index<=TOTAL_AMOUNT){
			System.out.println("请第"+index+"顾客到第"+TICKET_NAME+"窗口,办理业务");
			index++;
		}
	}
}

在这里插入图片描述

2、runnable

public class TicketWind implements Runnable {
	private int index=1;
	private final static int TOTAL_AMOUNT = 50;
	@Override
	public void run() {
		while (index<=TOTAL_AMOUNT){
			System.out.println("请第"+index+"顾客到第"+Thread.currentThread().getName()+"窗口,办理业务");
			index++;
		}
	}
}

在这里插入图片描述

3、策略模式

runnable接口这种模式类似于策略模式,他将控制部分和执行部分进行了分离。
参考

4、ThreadGroup

public static void main(String[] args) {

		Thread t = new Thread(()->{
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		});
		t.start();
		ThreadGroup threadGroup = t.getThreadGroup();
		ThreadGroup threadGroup1 = Thread.currentThread().getThreadGroup();
		System.out.println(threadGroup.getName());//t所属线程组
		System.out.println(threadGroup1.getName());

		int activeCount = threadGroup.activeCount();//活动线程总数
		System.out.println(activeCount);
		Thread[] threads= new Thread[activeCount];
		threadGroup.enumerate(threads);
		Arrays.asList(threads).forEach(System.out::println);//活动的线程

	}

在这里插入图片描述

创建线程但是没有指定线程组时,默认使用父线程的线程组(这是main)。其中活跃线程数是3个,包含一个monitor。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值