zoukankan      html  css  js  c++  java
  • 生产者消费者 ProducerConsumer

    生产者消费者是常见的同步问题。一个队列,头部生产数据,尾部消费数据,队列的长度为固定值。当生产的速度大于消费的速度时,队列逐渐会填满,这时就会阻塞住。当尾部消费了数据之后,生产者就可以继续生产了。

    生产者

    package com.example;
    
    import java.util.List;
    
    public class Producer {
    
        private List<String> list;
    
        public Producer(List<String> list){
            this.list = list;
        }
    
        public void produce(String str){
            synchronized (list){
                if(list.size() >= ProducerConsumer.LIST_SIZE){
                    try {
                        list.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                list.add(0, str);
                System.out.println("produce item:"+str);
            }
        }
    }
    

    消费者

    package com.example;
    
    import java.util.List;
    
    public class Producer {
    
        private List<String> list;
    
        public Producer(List<String> list){
            this.list = list;
        }
    
        public void produce(String str){
            synchronized (list){
                if(list.size() >= ProducerConsumer.LIST_SIZE){
                    try {
                        list.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                list.add(0, str);
                System.out.println("produce item:"+str);
            }
        }
    }
    

    测试类

    package com.example;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class ProducerConsumer {
    
        public static int LIST_SIZE = 3;
    
        public static void main(String[] args){
            producerConsumerTest();
        }
    
        private static void producerConsumerTest(){
            List<String> list = new ArrayList<String>();
            final Producer producer = new Producer(list);
            final Consumer consumer = new Consumer(list);
    
            new Thread(new Runnable() {
                @Override
                public void run() {
                    int count = 0;
                    while(true){
                        count++;
                        producer.produce("num"+count);
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
    
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while(true){
                        int count = 0;
                        while(true){
                            consumer.consume();
                            try {
                                Thread.sleep(2500);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }).start();
    
    
        }
    
    }
    

    运行结果:

    数据超过3个时候就不能生产了,需要等待消费者。

      

  • 相关阅读:
    pdf 下载demo
    solr 7.7 搭建和搜索
    java 项目打jar包,用cmd运行,并且编写运行脚本
    excel poi导出demo
    微信小程序支付,带java源码
    ideal中把项目打成war包,并放在tomcat运行,遇见的问题。。。
    ideal中项目resources下txt文件读取不到的问题。
    托管线程池
    线程同步
    使用Fiddler抓取手机上的数据包
  • 原文地址:https://www.cnblogs.com/MiniHouse/p/6701231.html
Copyright © 2011-2022 走看看