zoukankan      html  css  js  c++  java
  • 多生产者多消费者(第二种方式2.2)基于自己实现的阻塞队列

    MessageQueue 和blockQueue起到的作用是一样的

    public class Message {
        private String data;
    
        public Message(String data) {
            this.data = data;
        }
    
        public String getData() {
            return data;
        }
    }
    public class MessageQueue {
    
        private final LinkedList<Message> queue;
    
        private final int limit;
    
        public MessageQueue() {
            limit = 10;
            this.queue = new LinkedList<>();
        }
    
    
        public void put(final Message message) throws InterruptedException {
            synchronized (queue) {
                while (queue.size() > limit) {
                    queue.wait();
                }
    
                queue.addLast(message);
                queue.notifyAll();
            }
        }
    
        public Message take() throws InterruptedException {
            synchronized (queue) {
                while (queue.isEmpty()) {
                    queue.wait();
                }
    
                Message message = queue.removeFirst();
                queue.notifyAll();
                return message;
            }
        }
    
        public int getMaxLimit() {
            return this.limit;
        }
    
        public int getMessageSize() {
            synchronized (queue) {
                return queue.size();
            }
        }
    }

    生产者

    public class ProducerThread extends Thread {
    
        private final MessageQueue messageQueue;
    
        private final static Random random = new Random(System.currentTimeMillis());
    
        private final static AtomicInteger counter = new AtomicInteger(0);
    
        public ProducerThread(MessageQueue messageQueue, String  seq) {
            super("【生产者" + seq+"");
            this.messageQueue = messageQueue;
        }
    
        @Override
        public void run() {
            while (true) {
                try {
                    Message message = new Message("Message-" + counter.getAndIncrement());
                    messageQueue.put(message);
                    System.out.println(Thread.currentThread().getName() + " 生产消息 " + message.getData());
                    Thread.sleep(random.nextInt(1000));
                } catch (InterruptedException e) {
                    break;
                }
            }
        }
    }

    消费者

    public class ConsumerThread extends Thread {
    
        private final MessageQueue messageQueue;
    
        private final static Random random = new Random(System.currentTimeMillis());
    
        public ConsumerThread(MessageQueue messageQueue, String seq) {
             super("【消费者" + seq+"");
             this.messageQueue = messageQueue;
        }
    
        @Override
        public void run() {
            while (true) {
                try {
                    Message message = messageQueue.take();
                    System.out.println(Thread.currentThread().getName() + " 消费消息  " + message.getData());
                    Thread.sleep(random.nextInt(1000));
                } catch (InterruptedException e) {
                    break;
                }
            }
        }
    }

     测试

    public class ProducerAndConsumerClient {
    
        public static void main(String[] args) {
            final MessageQueue messageQueue = new MessageQueue();
            new ProducerThread(messageQueue, "").start();
            new ProducerThread(messageQueue, "").start();
            new ProducerThread(messageQueue, "").start();
            
            new ConsumerThread(messageQueue, "").start();
            new ConsumerThread(messageQueue, "").start();
        }
    }
  • 相关阅读:
    构建之法(一)
    大二下周总结十四
    寒假学习报告03
    寒假学习报告02
    2019春季学期个人总结
    2019春学习进度报告(第十六周)
    计算英语最长单词连
    2019春学习进度报告(第十五周)
    用户体验评价
    2019春学习进度报告(第十四周)
  • 原文地址:https://www.cnblogs.com/moris5013/p/10899512.html
Copyright © 2011-2022 走看看