美文网首页
生产者-消费者模式

生产者-消费者模式

作者: jiahzhon | 来源:发表于2020-10-09 10:00 被阅读0次
    • 传递消息的实体类
    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 static int DEFAULT_MAX_LIMIT = 100;
    
        private final int limit;
    
        public MessageQueue() {
            this(DEFAULT_MAX_LIMIT);
        }
    
        public MessageQueue(final int limit) {
            this.limit = limit;
            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, int seq) {
            super("PRODUCER-" + 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() + " put message " + 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, int seq) {
            super("Consumer-" + seq);
            this.messageQueue = messageQueue;
        }
    
        @Override
        public void run() {
            while (true) {
                try {
                    Message message = messageQueue.take();
                    System.out.println(Thread.currentThread().getName() + " take a message " + 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, 1).start();
            new ProducerThread(messageQueue, 2).start();
            new ProducerThread(messageQueue, 3).start();
            new ConsumerThread(messageQueue, 1).start();
            new ConsumerThread(messageQueue, 2).start();
        }
    }
    

    相关文章

      网友评论

          本文标题:生产者-消费者模式

          本文链接:https://www.haomeiwen.com/subject/sajxpktx.html