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();
        }
    }
    
  • 相关阅读:
    awk命令使用整理
    oracle pl/sql中record和%rowtype整理
    expect实现非交互下的ssh连接, expect简单使用整理
    shell通配符, 变量, shell作用域, $#@*等说明
    python之爬虫(三) Urllib库的基本使用
    python之爬虫(二)爬虫的原理
    python之爬虫--番外篇(一)进程,线程的初步了解
    Python之Web框架
    Python之爬虫
    Django【进阶篇 】
  • 原文地址:https://www.cnblogs.com/zk2020/p/14123820.html
Copyright © 2011-2022 走看看