zoukankan      html  css  js  c++  java
  • 多线程之责任链案例

    需求:(本人最近学习多线程,该需求是自己想的,不对的地方望不要介意)
    牛奶制作:1、获取牛奶源  2、工厂进行加工  3、包装
              该过程是一个责任链的模式,整个过程是一个串行过程,单独1/2/3步骤是一个独立过程



    package
    com.wl.Test.duty; public interface IMikeFactory { //定义一个生产牛奶方法 void produceMike(MikeEntity mike); }
    package com.wl.Test.duty;
    
    /***
     * 牛奶实体
     * @author gzyc
     *
     */
    public class MikeEntity {
        private String name;
        private String address;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getAddress() {
            return address;
        }
        public void setAddress(String address) {
            this.address = address;
        }
        @Override
        public String toString() {
            return "MikeEntity [name=" + name + ", address=" + address + "]";
        } 
        
        
        
    }
    package com.wl.Test.duty;
    
    import java.util.concurrent.LinkedBlockingQueue;
    
    /***
     * @desc   第一步:获取牛奶源
     * @author gzyc
     *
     */
    public class MikeSource extends Thread implements IMikeFactory{
        
        private IMikeFactory mikeFactory;
        //定义一个存储牛奶源的阻塞队列
        private LinkedBlockingQueue<MikeEntity> queue = new LinkedBlockingQueue<>();
        
        //定义一个控制运行的开关
        private volatile boolean flag = false;
        
        public MikeSource(IMikeFactory mikeFactory) { 
            this.mikeFactory = mikeFactory;
        }
        
        @Override
        public void produceMike(MikeEntity mike) { 
            queue.add(mike);
        }
    
        @Override
        public void run() {
            while (!this.currentThread().isInterrupted()) {
                //while (!flag) {
                 try {
                    //从队列中拿到牛奶源
                    MikeEntity mike = queue.take();
                    System.out.println("获取到牛奶源:"+mike);
                    //交给下一步骤进行加工牛奶
                    mikeFactory.produceMike(mike);
                } catch (InterruptedException e) { 
                    //e.printStackTrace();
                    break;
                } 
            }
            System.out.println("牛奶源结束");
        }
        
        
        
    }
    package com.wl.Test.duty;
    
    import java.util.concurrent.LinkedBlockingQueue;
    
    /***
     * @desc   第二步:加工牛奶源
     * @author gzyc
     *
     */
    public class MikeProcess extends Thread implements IMikeFactory{
        
        private IMikeFactory mikeFactory;
        //定义一个存储牛奶源的阻塞队列
        private LinkedBlockingQueue<MikeEntity> queue = new LinkedBlockingQueue<>();
        
        //定义一个控制运行的开关
        private volatile boolean flag = false;
        
        public MikeProcess(IMikeFactory mikeFactory) { 
            this.mikeFactory = mikeFactory;
        }
        
        @Override
        public void produceMike(MikeEntity mike) { 
            //对牛奶进行加工
            queue.add(mike);
        }
    
        @Override
        public void run() {
            while (!flag) {
                 try {
                    //从队列中拿到加工过后的牛奶
                    MikeEntity mike = queue.take();
                    System.out.println("加工过后的牛奶:"+mike);
                    //交给下一步骤进行加工牛奶
                    mikeFactory.produceMike(mike);
                } catch (InterruptedException e) { 
                    //e.printStackTrace();
                    break;
                } 
            }
            System.out.println("牛奶加工结束");
        }
        
        
        
    }
    package com.wl.Test.duty;
    
    import java.util.concurrent.LinkedBlockingQueue;
    
    /***
     * @desc   第三步:牛奶包装
     * @author gzyc
     *
     */
    public class MikePackage extends Thread implements IMikeFactory{
        
        private IMikeFactory mikeFactory;
        //定义一个存储牛奶源的阻塞队列
        private LinkedBlockingQueue<MikeEntity> queue = new LinkedBlockingQueue<>();
        
        //定义一个控制运行的开关
        private volatile boolean flag = false;
        
        public MikePackage(IMikeFactory mikeFactory) { 
            this.mikeFactory = mikeFactory;
        }
        
        public MikePackage() { 
        }
        
        @Override
        public void produceMike(MikeEntity mike) { 
            //对牛奶进行包装
            queue.add(mike);
        }
    
        @Override
        public void run() {
            while (!flag) {
                 try {
                    //从队列中拿到包装过后的牛奶
                    MikeEntity mike = queue.take();
                    System.out.println("包装过后的牛奶:"+mike);
                    //牛奶制作结束
                    System.out.println(mike+"牛奶制作结束");
                    //mikeFactory.produceMike(mike);
                } catch (InterruptedException e) { 
                    //e.printStackTrace();
                    break;
                } 
            }
            System.out.println("牛奶包装结束");
        }
        
        
        
    }
    package com.wl.Test.duty;
    
    import java.util.concurrent.LinkedBlockingQueue;
    
    /***
     * 责任链
     * @author gzyc
     * 牛奶制作:1、获取牛奶源  2、工厂进行加工  3、包装
     *         该过程是一个责任链的模式,整个过程是一个串行过程,单独1/2/3步骤是一个独立过程
     */
    public class DutyMainTest {
        private static IMikeFactory mikeFactory;
        
        public static void main(String[] args) throws InterruptedException { 
            
            //启动包装牛奶线程
            MikePackage mikePackage = new MikePackage();
            mikePackage.start();
            
            //启动加工牛奶线程
            MikeProcess mikeProcess = new MikeProcess(mikePackage);
            mikeProcess.start(); 
            
            //启动或者牛奶源线程
            mikeFactory = new MikeSource(mikeProcess);
             ((MikeSource)mikeFactory).start();
            
            MikeEntity mikeEntity;
            for(int i=1;i<=10;i++){
                mikeEntity = new MikeEntity();
                mikeEntity.setName("花生牛奶"+i);
                mikeEntity.setAddress("贵阳"+i);
                mikeFactory.produceMike(mikeEntity);
            }
            
            Thread.currentThread().sleep(5000);
            //中断线程,
            mikePackage.interrupt();
            mikeProcess.interrupt();
            ((MikeSource)mikeFactory).interrupt();
        }
    }
  • 相关阅读:
    【CSP-S膜你考】不怕噩梦 (模拟)
    【CSP-S膜你考】 A
    【CSP-S膜你考】即时战略(模拟)
    【CSP-S膜你考】最近公共祖先 (数学)
    【题解】洛谷 P1449 后缀表达式
    【题解】 洛谷 P2649 游戏预言
    【题解】洛谷 P1083 借教室
    【题解】洛谷 P1080 国王游戏
    【题解】洛谷 P1079 Vigenère 密码
    Bzoj4558 [JLoi2016]方
  • 原文地址:https://www.cnblogs.com/wanglu1991/p/11936773.html
Copyright © 2011-2022 走看看