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();
        }
    }
    
  • 相关阅读:
    UVA 10970 Big Chocolate
    HBuilder 安装uviewui2.0
    域名访问配置支持ipv6
    SSIS学习视频(SQL Server 2008)
    碰到MySQL无法启动1067错误问题
    对存储过程进行加密和解密(SQL 2008/SQL 2012)
    脚本文件比较工具WinMerge
    通过SQL绘制杨辉三角
    通用分页存储过程(SQL Server 2005)
    重新组织和重新生成索引sp_RefreshIndex
  • 原文地址:https://www.cnblogs.com/zk2020/p/14123820.html
Copyright © 2011-2022 走看看