zoukankan      html  css  js  c++  java
  • Object.wait()实现生产者消费者模式

    主调用程序:

    public class MainDemo {
        public static void main(String[] args) {
            Box box=new Box();
    
            Product product=new Product(box);
            Customer customer =new Customer(box);
    
            Thread th1=new Thread(product);
            Thread th2=new Thread(customer);
    
            th1.start();
            th2.start();
    
        }
    }

    共享资源类:

    /*
    * 共享数据区
    * */
    public class Box {
        private int milk;
        private boolean state=false;
    
        /*
        * 加锁调用
        * */
        public synchronized void put(int milk)
        {
            if (state){
                try {
                    /* 事件锁:
                    * 1.不带参数:导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法。
                    * 2.带参数重载:导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法,或指定的时间已过。
                    * */
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            this.milk=milk;
    
            System.out.println("放入:"+this.milk);
    
            this.state=true;
    
            /*
            * 唤醒正在等待对象监视器的所有线程。
            * */
            notifyAll();
        }
    
        public synchronized void get(){
            if (!state){
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
    
            System.out.println("取出:"+milk);
    
            state=false;
    
            notifyAll();
        }
    }

    生产者:

    /*
    * 生产者类
    * */
    public class Product implements Runnable {
        private Box box;
    
        public Product(Box box) {
            this.box = box;
        }
    
        @Override
        public void run() {
            for (int i=1;i<11;i++){
                box.put(i);
            }
        }
    }

    消费者:

    /*
    * 消费者类
    * */
    public class Customer implements Runnable {
        private Box box;
    
        public Customer(Box box) {
            this.box = box;
        }
    
        @Override
        public void run() {
            while (true){
                box.get();
            }
        }
    }
  • 相关阅读:
    linux 下安装mongodb
    python 多线程, 多进程, 协程
    5.rabbitmq 主题
    4.rabbitmq 路由
    e.target与e.currentTarget对比
    使用ffmpeg下载m3u8流媒体
    本机添加多个git仓库账号
    IE hack 条件语句
    IE8 兼容 getElementsByClassName
    IE 下 log 调试的一点不同
  • 原文地址:https://www.cnblogs.com/zhuyapeng/p/13825777.html
Copyright © 2011-2022 走看看