学习多线程随笔。同时引出模板方法设计模式和回顾学习过的策略模式解决多重if–else

学习多线程随笔。同时引出模板方法设计模式和回顾学习过的策略模式解决多重if–else

策略模式学习参考资料: https://www.cnblogs.com/DiDi516/p/11787257.html

什么是进程?
    可以理解成是一个操作系统上的一个应用程序,而线程是进程中的一条可执行路径;
    进程是线程的一个集合.
参考网站资料:
    https://www.cnblogs.com/aaronthon/p/9824396.html

并发 (上下执行)---- 多核CPU 并行

场景:读数据库同时对磁盘进行IO操作.
    
    ---> 如何创建线程? | 如何启动线程?  
#jps   //查看应用程序对应的端口
#jconsole + 端口 打开java监视和管理控制台.

Thread / Runnable  |  main线程 (非守护线程) 程序的入口 | 后台线程(守护线程) 比如:垃圾回收器等守护线程.

创建线程  |  线程生命周期  | 操作共享资源的多线程 ---线程安全问题. 线程本地变量  / 共享内存变量
 
匿名内部类创建线程:
        new Thread("线程01"){
            @Override
            public void run() {
          
                
                
            }
        }.start();

extends Thread  | implements Runnable  


new 新建状态  | runnable 就绪状态  | running 运行状态 |blocked 阻塞状态 | terminated 死亡状态
CPU执行权.



匿名内部类


工作逻辑的方法使用final 修饰防止子类复写.
模版方法中变化的算法。抽取出来,使用一个抽象方法。让其子类具体去实现自己的算法.

new Thread(){
    public void run(){
        System.out.println("xxxx");
    }
}.start();

线程实例调用start()方法使用了模版方法设计模式.





线程生命周期:https://www.jianshu.com/p/468c660d02da

线程生命周期:
    1.new Thread() 新建状态
    2.new Thread() .start() 线程进入 runnable 就绪状态等待系统为其分配CPU时间片。
        所以需要注意执行了start()方法就立即执行了。
        CPU在多条线程之间快速切换。
    3.根据不同的操作 线程状态在running运行  blocked 阻塞  runnable 就绪三种状态来回切换
            操作:sleep() | join() | wait() | synchronized() | notifiy() | notifyAll() | suspend()
                setPriority(int newPriority)
                setDaemon()方法.
    4.线程任务执行完之后 最终进行入 terminated 死亡状态.

- 线程对象直接调用run()方法:
    - 系统把线程对象当成一个普通对象,而run()方法也是一个普通方法,而不是线程执行体;
    - 调用了线程的run()方法之后,该线程已经不再处于新建状态
    - 不要再次调用线程对象的start()方法。只能对处于新建状态的线程调用start()方法,
      否则将引发IllegaIThreadStateExccption异常

- 在阻塞状态的线程只能进入就绪状态,无法直接进入运行状态


为什么创建了线程实例,然后线程实例去调用start()方法? 
    ----->去查看start()方法源码 调用了本地方法native方法。C语言。调用run()方法. [使用模版方法]

> start()启动一个线程。线程执行run()方法。run()方法里面去实现自己的业务逻辑。




模版方法
   抽象类
        模版方法使用final修饰防止子类去重写.
        抽象方法 ----子类实现自己的算法逻辑。

模仿Runnable写的一个模版方法: ---------->就是为什么创建线程实例,实例去调用start()方法启动一个线程。
小技巧使用模版方法.
/**
 * 模版方法 要求是一个抽象类  .模板方法是一个final修饰的方法
 * 防止子类去重写
 */
public  abstract  class TemplateMehtod {

    public final void print(){
        System.out.println("#########################");
            wrapperMethod();
        System.out.println("###########################");
    }
    public abstract   void wrapperMethod()  ;
}


class Demo{
    public static void main(String[] args) {

        TemplateMehtod t1 = new TemplateMehtod() {
            @Override
            public void wrapperMethod() {
                System.out.println("*"+ "hello template"+"*");
            }
        };


        t1.print();

        TemplateMehtod t2 = new TemplateMehtod() {
            @Override
            public void wrapperMethod() {
                System.out.println("+"+ "hello template"+"+");
            }
        };

        t2.print();

    }
}


template模版方法属性类的行为模式.[模板方法模式把类的行为逻辑抽取为顶级逻辑。让其子类去做变化的东西]
使用场景:
    - 一个计算存款利息的例子
    - 请客吃饭


模板方法模式在Servlet中的应用:
 使用过Servlet的人都清楚,除了要在web.xml做相应的配置外,
  还需继承一个叫HttpServlet的抽象类。HttpService类提供了一个service()方法,
  这个方法调用七个do方法中的一个或几个,完成对客户端调用的响应。
  这些do方法需要由HttpServlet的具体子类提供,因此这是典型的模板方法模式

回归一下:装饰模式+ 简单工厂 + 字典map 解决多重if-else
/**
 * 回执单
 */
public class Recipte {

    private String msg;


    private String type;

    //提供set/get方法
}


/**
 * 模拟有很多回执对象
 */
public class RecipteBuilder {


    public static List<Recipte> recipteList() {
        List<Recipte> recipteList = new ArrayList<>();
        recipteList.add(new Recipte("ms01----msg:ms01", "ms01"));
        recipteList.add(new Recipte("ms03----msg:ms03", "ms03"));
        recipteList.add(new Recipte("ms02----msg:ms02", "ms02"));
        recipteList.add(new Recipte("ms04----msg:ms04", "ms04"));

        return recipteList;
    }


}

/**
 * 处理回执对象的策略对象接口
 */
public interface RecipteStrategyHandler {

      void handler(Recipte recipte);

}

/*
每种回执类型对象  对应的 策略处理
*/
public class Ms01RecipterStrategyHandler implements RecipteStrategyHandler {
    @Override
    public void handler(Recipte recipte) {
        System.out.println(" type:"+recipte.getType()+"--->Ms01RecipterStrategyHandler");
    }
}

。。。其他策略实现类差不多的这里就先不忙写了。。。。。


 
/**
 * 管理回执策略对象的上下文的一个类.
 */
public class RecipterStrategyContext {
    
    //聚合模式 ----类和类关系的一种依赖关系   recipteStrategyHandler 通过工厂创建然后赋值给上下文对象的他
    private RecipteStrategyHandler recipteStrategyHandler;

    public void setRecipteStrategyHandler(RecipteStrategyHandler recipteStrategyHandler){
        this.recipteStrategyHandler = recipteStrategyHandler;
    }
    
    //上下文对象中提供一个对策略对象处理的公共方法。把回执对象传递过来
    public void handler(Recipte recipte){
        if(recipte !=null){
            recipteStrategyHandler.handler(recipte);
        }
    }
 

}


/**
 * 策略工厂创建策略对象. map key-value的形式来创建对应类型的策略实现类对象
 */
public class RecipterFactory {

    private  Map<String, RecipteStrategyHandler> map;


    public  RecipterFactory(){
        this.map = new HashMap<>();
        this.map.put("ms01",new Ms01RecipterStrategyHandler());
        this.map.put("ms02",new Ms02RecipterStrategyHandler());
        this.map.put("ms03",new Ms03RecipterStrategyHandler());
        this.map.put("ms04",new Ms04RecipterStrategyHandler());
    }


    public  RecipteStrategyHandler createRecipteStrategy(String type){
        return map.get(type);
    }

}


/**
 * 策略工厂创建策略对象. map key-value的形式来创建对应类型的策略实现类对象
 */
public class RecipterFactory {

    private  Map<String, RecipteStrategyHandler> map;


    public  RecipterFactory(){
        this.map = new HashMap<>();
        this.map.put("ms01",new Ms01RecipterStrategyHandler());
        this.map.put("ms02",new Ms02RecipterStrategyHandler());
        this.map.put("ms03",new Ms03RecipterStrategyHandler());
        this.map.put("ms04",new Ms04RecipterStrategyHandler());
  
    }


    public  RecipteStrategyHandler createRecipteStrategy(String type){
        return map.get(type);
    }
}


public class RecipterClient {
    public static void main(String[] args) {

        List<Recipte> recipteList = RecipteBuilder.recipteList();


        //常见回执策略上下文
        RecipterStrategyContext recipterStrategyContext = new RecipterStrategyContext();
        for (Recipte recipte : recipteList) {
            //通过recipte 获取对应的 策略处理

            RecipterFactory recipterFactory = new RecipterFactory();
            RecipteStrategyHandler recipteStrategy = recipterFactory.createRecipteStrategy(recipte.getType());
            //给上下文中组合对象赋值
            recipterStrategyContext.setRecipteStrategyHandler(recipteStrategy);
            //调用上下文中的。提供的策略处理方法
            recipterStrategyContext.handler(recipte);
        }
 
    }
}




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/100728.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号