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();
        }
    }
  • 相关阅读:
    bzoj 4897 天赋 有向图的矩阵数定理
    bzoj 4621 Tc605 思想+dp
    bzoj 4596 [Shoi2016]黑暗前的幻想乡 矩阵树定理+容斥
    bzoj 4455 [Zjoi2016]小星星 树形dp&容斥
    获取Android设备无线和以太网MAC地址
    Java WebSocket库:https://github.com/TooTallNate/Java-WebSocket
    UsbManager, UsbDevice的简单示例
    Android开发之开机自动启动应用
    使用Microsoft Office 2007将文档转换为PDF
    C/C++实现删除字符串的首尾空格
  • 原文地址:https://www.cnblogs.com/moris5013/p/10899512.html
Copyright © 2011-2022 走看看