学习资料:汪文君
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。