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);
            }

    运行结果图:

  • 相关阅读:
    多线程--ThreadLocal类
    常用开发类库支持--UUID及空值处理Optional
    国际化的程序实现及其原理
    浅析java设计模式(一)----异构容器,可以存储任何对象类型为其他类提供该对象
    使用批处理命令注册运行mysql数据库,无需注册mysql服务,可以在任意电脑登录使用
    计算机中位、字长、字的区别
    SQL Server用户自定义数据类型
    简单的回合制小游戏
    单链表创建、删除、查找、插入之C语言实现
    LeetCode-905 Sort Array By Parity Solution (with Java)
  • 原文地址:https://www.cnblogs.com/yfsmooth/p/4659937.html
Copyright © 2011-2022 走看看