zoukankan      html  css  js  c++  java
  • Java多线程实现生产者消费者延伸问题

    在操作系统中有一类问题被称为生产者消费者问题:意为,有数个生产者生产产品,有数个消费者消费产品,他们共享一定数量的缓存。

    这里用java多线程编程,实现生产者消费者问题的一种延伸,橘子苹果问题。

    题目如下:

    有苹果橘子生产者各20个,有苹果橘子消费者各20个,他们公用20个缓存区。要求能随时查看缓存区内容,随时查看生产消费内容情况,随时暂停生产开始生产。

    我们的实现思路:

    1.首先创建一个缓存区类,其中包含静态的,长度大小为20的数组,用来存放和取出生产的产品;一个静态的日志变量List,用来记录对缓存区的操作;

    以及对缓存区的操作方法和对日志变量的操作方法。

    2.创建苹果生产者类和橘子生产者类,他们继承Thread类,其中包含四个变量:缓存类的实例对象,生产者自己的id,运行周期,暂停信号量;以及对run方法的重写。

    3.创建苹果消费者类和橘子消费者类,他们继承Thread类,其中包含四个变量:缓存类的实例对象,生产者自己的id,运行周期,暂停信号量;以及对run方法的重写。

    4.在程序中添加静态代码块,初始时创建20个橘子生产者20个苹果生产者,20个橘子消费者,20个苹果消费者。

    5.在程序开始时开启线程。

    6.表现层我们可以利用jsp来实现,用ajax做刷新模仿实时更新(这里用jsp实现并不是最好的选择)

    一下贴出实现代码:

    缓存类

    public class BufferCase {
        private static List<String> buffer = new ArrayList<String>();
        private static List<String> log = new ArrayList<String>();
        //制造缓存内容
        public synchronized boolean inBuffer(String goods){
            if(buffer.size()==20)
                return false;
            else if(buffer.add(goods))
                return true;
            else
                return false;
        }
        //消费缓存内容
        public synchronized String outBuffer(int type){
            for(int i=0;i<buffer.size();i++){
                if(type==1){
                    if(buffer.get(i).equals("apple")){
                        buffer.remove(i);
                        return new String("apple");
                    }
                }
                if(type==2){
                    if(buffer.get(i).equals("orange")){
                        buffer.remove(i);
                        return new String("orange");
                    }
                }
            }
            return null;
        }
        //写入日志内容
        public synchronized void inLog(String log){
            this.log.add(log);
        } 
        //清除日志内容
        public static synchronized void clearLog(){
            log.clear();
        }
        //输出日志内容
        public static List<String> outLog(){
            return log;
        }
        //输出缓存内容
        public static List<String> outBuffer(){
            return buffer;
        }
    }

    消费者类

    public class OrangeConsumer extends Thread {
        BufferCase buffer = null;
        int time= 2000 ;//运行周期
        boolean flag=true;//是否暂停
        int id;//消费者id
        public void setFlag(boolean flag){
            this.flag = flag;
        }
        public void setTime(int time) {
            this.time = time;
        }
        public OrangeConsumer(BufferCase bf,int id){
            buffer = bf;
            this.id = id;
        }
        
        @Override
        public void run() {
            while(true){
            // 设定运行周期
            try {
                sleep(time);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //消费橘子
            synchronized(buffer){
                if(flag==false)
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                String goods = null;
                goods = buffer.outBuffer(2);
                if(goods==null)
                    buffer.inLog("橘子消费者"+id+"消费橘子失败");
                else
                    buffer.inLog("橘子消费者"+id+"消费橘子成功");
            }
            super.run();
            }
        }
        
    }
    public class AppleConsumer extends Thread{
        public BufferCase buffer = null;
        int time = 2000;//运行周期
        boolean flag=true;//是否暂停
        int id;//消费者id
        public void setFlag(boolean flag){
            this.flag = flag;
        }
        public void setTime(int time) {
            this.time = time;
        }
        public int getTime(){
            return this.time;
        }
        public AppleConsumer(BufferCase bf,int id){
            buffer = bf;
            this.id = id;
        }
        
        @Override
        public void run() {
            while(true){
                // 设定运行周期
                try {
                    sleep(time);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //消费苹果
                
                    synchronized(buffer){
                        if(flag==false)
                            try {
                                wait();
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }
                        String goods = null;
                        goods = buffer.outBuffer(1);
                        if(goods==null)
                            buffer.inLog("苹果消费者"+id+"消费苹果失败");
                        else
                            buffer.inLog("苹果消费者"+id+"消费苹果成功");
                    }
                super.run();
            }
        }
    }

    生产者类

    public class AppleProducer extends Thread {
        BufferCase buffer = null;
        int time= 2000 ;//运行周期
        boolean flag=true;//是否暂停
        int id;//消费者id
        public void setFlag(boolean flag){
            this.flag = flag;
        }
        public void setTime(int time) {
            this.time = time;
        }
        public AppleProducer(BufferCase bf,int id){
            buffer = bf;
            this.id = id;
        }
        
        @Override
        public void run() {
            while(true){
            // 设定运行周期
            try {
                sleep(time);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //生产苹果
            if(flag==true)
            synchronized(buffer){    
                String goods = new String("apple");
                if(buffer.inBuffer(goods))
                    buffer.inLog("苹果生产者"+id+"放入苹果成功");
                else
                    buffer.inLog("苹果生产者"+id+"放入苹果失败");
            }
            super.run();
            }
        }    
    }
    public class OrangeProducer extends Thread{
        BufferCase buffer = null;
        int time= 2000 ;//运行周期
        boolean flag=true;//是否暂停
        int id;//消费者id
        public void setFlag(boolean flag){
            this.flag = flag;
        }
        public void setTime(int time) {
            this.time = time;
        }
        public OrangeProducer(BufferCase bf,int id){
            buffer = bf;
            this.id = id;
        }
        
        @Override
        public void run() {
            while(true){
            // 设定运行周期
            try {
                sleep(time);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            //生产橘子
            if(flag==true)
            synchronized(buffer){
                String goods = new String("orange");
                if(buffer.inBuffer(goods))
                    buffer.inLog("橘子生产者"+id+"放入橘子成功");
                else
                    buffer.inLog("橘子生产者"+id+"放入橘子失败");
            }
            super.run();
            }
        }
    }

    初始化角色类:

    public class AllRoles {
        public static AppleConsumer[] ac = new AppleConsumer[20];
        public static OrangeConsumer[] oc = new OrangeConsumer[20];
        
        public static AppleProducer[] ap = new AppleProducer[20];
        public static OrangeProducer[] op = new OrangeProducer[20];
        
        static{
            BufferCase bf = new BufferCase();
            for(int i=0;i<20;i++){//初始化生产者消费者线程
                ap[i] = new AppleProducer(bf,i);
                op[i] = new OrangeProducer(bf,i);
                
                ac[i] = new AppleConsumer(bf,i);
                oc[i] = new OrangeConsumer(bf,i);
            }
        }
    }

    各种业务逻辑

    //开启线程
    for(int i=0;i<20;i++){
                    AllRoles.ac[i].start();
                    AllRoles.ap[i].start();
                    AllRoles.oc[i].start();
                    AllRoles.op[i].start();
                }
    //暂停线程
    for(int i=0;i<20;i++){
                AllRoles.ac[i].setFlag(false);
                AllRoles.ap[i].setFlag(false);
                AllRoles.oc[i].setFlag(false);
                AllRoles.op[i].setFlag(false);
            }
    //重启线程
    for(int i=0;i<20;i++){
                AllRoles.ac[i].setFlag(true);
                AllRoles.ap[i].setFlag(true);
                AllRoles.oc[i].setFlag(true);
                AllRoles.op[i].setFlag(true);
            }

    运行结果图:

  • 相关阅读:
    leetcode 86. Partition List
    leetcode 303. Range Sum Query
    leetcode 1310. XOR Queries of a Subarray
    leetcode 1309. Decrypt String from Alphabet to Integer Mapping
    leetcode 215. Kth Largest Element in an Array
    将numpy.ndarray写入excel
    leetcode 1021 Remove Outermost Parentheses
    leetcode 1306. Jump Game III
    leetcode 1305. All Elements in Two Binary Search Trees
    ICCV2019 oral:Wavelet Domain Style Transfer for an Effective Perception-distortion Tradeoff in Single Image Super-Resolution
  • 原文地址:https://www.cnblogs.com/yfsmooth/p/4659937.html
Copyright © 2011-2022 走看看