美文网首页
Java实现生产者和消费者模式

Java实现生产者和消费者模式

作者: 季沐测试笔记 | 来源:发表于2021-08-21 22:21 被阅读0次

    模式概述

    实际包含两类线程

    • 一类是生产者用于生产数据
    • 一类是消费者用于消费数据

    为了解耦生产者和消费者的关系,通常采用共享的数据区域

    • 生产者生产数据放置在共享数据区域,不需要关心消费者的行为
    • 消费者只需要从共享数据区域去获得数据,不需要关心生产者的行为

    为了体现生产和消费过程中的等待和唤醒,Java提供的方法

    • void wait() 导致当前线程等待,直到另一个线程调用该对象的notify()方法或nitifyAll()方法
    • void notify() 唤醒正在等待对象监视器的单个线程
    • void notifyAll() 唤醒正在等待对象监视器的所有线程
    public class Box {
    
        private int milk;
    
        private boolean state = false;
    
        public synchronized void put(int milk){
            if (state){
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            this.milk = milk;
            System.out.println("送奶工将第"+this.milk+"瓶奶放入");
            state = true;
            notifyAll();
        }
    
        public synchronized void get(){
            if (!state){
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("用户拿到第"+this.milk+"瓶奶");
            state = false;
            notifyAll();
        }
    
    }
    
    
    
    public class Producer implements Runnable{
    
        private Box b;
        public Producer(Box b) {
           this.b = b;
        }
    
        @Override
        public void run() {
            for (int i = 1;i<= 5;i++){
                b.put(i);
            }
        }
    }
    
    
    public class Customer implements Runnable {
    
        private Box b;
        public Customer(Box b) {
            this.b = b;
        }
    
        @Override
        public void run() {
            while (true){
                b.get();
            }
        }
    }
    
    public class BoxDemo {
        public static void main(String[] args) {
            Box b = new Box();
            Producer p = new Producer(b);
            Customer c = new Customer(b);
    
            Thread t1 = new Thread(p);
            Thread t2 = new Thread(c);
    
            t1.start();
            t2.start();
    
        }
    }
    

    相关文章

      网友评论

          本文标题:Java实现生产者和消费者模式

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