笔记20200515:多线程【静态代理模式】

①设计模式:
  • 真实角色
  • 代理角色:持有真实角色的引用
  • 二者实现相同的接口
  • package com.chengguo.线程;
    
    /**
     * 静态代理设计模式:
     * ①真实角色
     * ②代理角色:持有真实角色的引用
     * ③二者实现相同接口
     */
    public class Demo_20200509005_StaticProxy {
        public static void main(String[] args) {
    //        WeddingCompany wc = new WeddingCompany(new You());
    //        wc.HappyMarry();
            //创建真实角色(可以使用接口)
            Marry you = new You();
            //创建代理角色(可以使用接口),加入真实角色的引用
            Marry weddingCompany = new WeddingCompany(you);
            //执行
            weddingCompany.HappyMarry();
        }
    }
    
    //③二者实现相同接口
    interface Marry {
        //久旱逢甘露
        //他乡遇故知
        //洞房花烛夜
        //金榜题名时
        void HappyMarry();
    }
    
    //①真实角色
    class You implements Marry {
        //重写接口方法
        @Override
        public void HappyMarry() {
    
            System.out.println("新郎官结婚咯");
        }
    }
    
    //②代理角色
    class WeddingCompany implements Marry {
        private Marry you;
    
        //无参构造
        public WeddingCompany() {
        }
    
        //带参构造
        public WeddingCompany(Marry you) {
    
            this.you = you;
        }
    
        //重写接口方法
        @Override
        public void HappyMarry() {
            before();
            this.you.HappyMarry();
            after();
    
        }
    
        //结婚之后
        private void after() {
            System.out.println("结婚之后--->收尾款");
        }
    
        //结婚之前
        private void before() {
            System.out.println("结婚之前--->布置现场");
        }
    }

    静态代理+线程模拟12306抢票实现

  • package com.chengguo.线程;
    
    /**
     * 多个线程同时操作同一个对象:买火车票的例子
     */
    public class Demo_20200509002_Thread implements Runnable {
        //定义火车票默认张数
        private int ticketNums = 10;
    
        @Override
        public void run() {
            while (true) {
                if (ticketNums <= 0) {
                    break;
                } else {
    
                    try {
                        //模拟延时
                        Thread.sleep(4000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
    
                    //获取当前票的名字:Thread.currentThread().getName();每抢一张票就--
                    System.out.println(Thread.currentThread().getName() + "抢到了第" + ticketNums-- + "张票");
                }
    
            }
    
        }
    
        public static void main(String[] args) {
            //创建runnable接口的实现类对象(真实角色)
            Demo_20200509002_Thread dt1 = new Demo_20200509002_Thread();
            //创建一个线程对象,通过线程对象来开启线程(代理角色:持有真实角色的引用)
    //        Thread thread1 = new Thread(dt1, "路人甲");
    //        thread1.start();
    //        Thread thread2 = new Thread(dt1, "路人乙");
    //        thread2.start();
    //        Thread thread3 = new Thread(dt1, "路人丙");
    //        thread3.start();
    
    //        优化代码
            new Thread(dt1, "路人甲").start();
            new Thread(dt1, "路人乙").start();
            new Thread(dt1, "路人丙").start();
        }
    }

    总结

  •  

     

posted @ 2020-05-30 16:46  忧桑の民工  阅读(111)  评论(0编辑  收藏  举报