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

      多生产者多消费者是Java中的一个经典的案例,采用等待唤醒机制来实现,代码如下:

      

    public class ProducerConsumer {
        public static void main(String[] args) {
            Resource res=new Resource();
            Producer pro1=new Producer(res);
            Producer pro2=new Producer(res);
            Consumer con1=new Consumer(res);
            Consumer con2=new Consumer(res);
            Thread t1=new Thread(pro1);
            Thread t2=new Thread(pro2);
            Thread t3=new Thread(con1);
            Thread t4=new Thread(con2);
            t1.start();
            t2.start();
            t3.start();
            t4.start();
        }
    }
    class Resource {
        private int count;
        private boolean flag=true;
        public synchronized void produce()  {
            while(!flag) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName()+"生产"+count+"烤鸭");
            count++;
            flag=false;
            this.notifyAll();
        }
        public synchronized void consume() {
            while(flag) {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName()+"消费"+count+"烤鸭");
            flag=true;
            this.notifyAll();
        }
    }
    class Producer implements Runnable{
        Resource r;
        
        public Producer(Resource r) {
            super();
            this.r = r;
        }
    
        @Override
        public void run() {
            while(true) {
                r.produce();
            }
        }
        
    }
    class Consumer implements Runnable {
        Resource r;
        public Consumer(Resource r) {
            super();
            this.r = r;
        }
        @Override
        public void run() {
            while(true) {
                r.consume();
            }
        }
        
    }

      还有一种采用BlockQueue实现的多生产者多消费者模式:

    import java.util.concurrent.ArrayBlockingQueue;
    
    /**
     * Created by Administrator on 2016/6/30.
     */
    public class Demo {
        public static void main(String[] args) {
            MyBuffer buffer=new MyBuffer();
            Producer pro1=new Producer(buffer);
            Producer pro2=new Producer(buffer);
            Consumer con1=new Consumer(buffer);
            Consumer con2=new Consumer(buffer);
            pro1.start();
            pro2.start();
            con1.start();
            con2.start();
        }
    }
    class MyBuffer {
        private ArrayBlockingQueue queue=new ArrayBlockingQueue(10);
        Object obj=null;
        public void put(Object obj) {
            try {
                queue.put(obj);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        public Object take() {
            try {
                obj= queue.take();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally {
                return obj;
            }
        }
    }
    class Producer extends Thread{
        private MyBuffer buffer1=new MyBuffer();
        static int count;
        public Producer(MyBuffer buffer1) {
            this.buffer1 = buffer1;
        }
        public void run() {
            while(true) {
                synchronized (this) {
                    String str = "烤鸭" + count;
                    buffer1.put(str);
                    System.out.println(Thread.currentThread().getName() + "生产" + str);
                    count++;
                }
            }
        }
    }
    class Consumer extends Thread {
        private MyBuffer buffer1=new MyBuffer();
        public Consumer(MyBuffer buffer1) {
            this.buffer1 = buffer1;
        }
        public void run() {
            while(true)
            System.out.println(Thread.currentThread().getName()+"消费"+buffer1.take());
        }
    }
     
  • 相关阅读:
    MySQL5.7.19 服务挂掉 自动关闭 mysqld got exception 0xc000001d win 2008R2
    intellij IDEA VS(Visual Studio) 常用 高效 黄金 快捷键
    .Net MVC Cache 缓存技术总结
    HttpContext.Current.Cache 过期时间
    Sql Server 数据类型与 C# 数据类型对照
    Spring注解@Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier、@scope
    Hibernate注解映射联合主键的三种主要方式
    hibernate 查询全部数据的三种方法
    Springframework和Hibernate版本对应关系
    C# 反射总结 获取 命名空间 类名 方法名
  • 原文地址:https://www.cnblogs.com/hlhdidi/p/5629600.html
Copyright © 2011-2022 走看看