zoukankan      html  css  js  c++  java
  • 生产者于消费者

    /**
     * 生产者-消费者案例
     * 生产者;需要不停的生产商品,当商品超出库存,不能在生产
     * 消费者;不停的消费商品,当库存为零,不能在消费。
     * <p>
     * 分析:
     * 1.是否是多线程问题
     * 2.是否有共享数据
     * 3.如果解决线程安全问题
     * 4.是否设计线程的通信
     */
    //店员
    class Clerk {
        private int num = 0;
    
        public synchronized void xiaoFei() {
            if (num < 20) {
                num++;
                System.out.println(Thread.currentThread().getName() + "开始生产第" + num + "产品");
                //唤醒线程
                this.notify();
            }else {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    
        public synchronized void shengChan() {
            if (num > 0) {
                System.out.println(Thread.currentThread().getName() + "消费者开始消费第" + num + "产品");
                num--;
    
                this.notify();
            }else {
                try {
                    this.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    //生产者
    class Proucer extends Thread {
    
        private Clerk clerk;
    
        public Proucer(Clerk clerk) {
            this.clerk = clerk;
        }
    
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + "生产者开始生产");
            while (true) {
                try {
                    sleep(110);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                clerk.shengChan();
            }
        }
    }
    
    //消费者
    class Consumer extends Thread {
        private Clerk clerk;
    
    
        Consumer(Clerk clerk, String name) {
            this.clerk = clerk;
            super.setName(name);
        }
    
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + "消费者开始消费");
            while (true) {
                try {
                    sleep(50);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                clerk.xiaoFei();
            }
        }
    }
    
    public class Test {
        public static void main(String[] args) {
            Clerk clerk = new Clerk();
            //生产者
            Proucer p = new Proucer(clerk);
            Thread p1 = new Thread(p, "迪奥");
            Thread p2 = new Thread(p, "跤四大");
            //消费者
            Consumer c = new Consumer(clerk, "吉良吉影");
    
            p1.start();
            p2.start();
            c.start();
        }
    }
    
  • 相关阅读:
    Linux systemctl 命令完全指南
    分享一些 Kafka 消费数据的小经验
    大数据日志采集系统
    使用Spring Boot Actuator将指标导出到InfluxDB和Prometheus
    这可能是最为详细的Docker入门吐血总结
    用不用lambda,这是一个问题
    es上的的Watcher示例
    Elasticsearch6.5.2 X-pack破解及安装教程
    oauth2.0通过JdbcClientDetailsService从数据库读取相应的配置
    Apache Beam实战指南 | 手把手教你玩转大数据存储HdfsIO
  • 原文地址:https://www.cnblogs.com/zk2020/p/14123820.html
Copyright © 2011-2022 走看看