zoukankan      html  css  js  c++  java
  • 生产者消费者(Lock)

    package com.kaibing.design;
    
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class ProductorAndCustomerLock {
    
    
        public static void main(String[] args) {
            Clerk clerk = new Clerk();
    
            Productor productor = new Productor(clerk);
            Customer customer = new Customer(clerk);
    
            new Thread(productor, "生产者A:").start();
            new Thread(customer, "消费者A:").start();
    
            new Thread(productor, "生产者B:").start();
            new Thread(customer, "消费者B:").start();
        }
    
        static class Clerk {//店员类
    
            private int product = 0;
    
            private Lock lock = new ReentrantLock();
            private Condition condition = lock.newCondition();
    
            public  void get() {//进货
    
                lock.lock();//加锁
    
                try{
                    while (product >= 1) {//容量为1
                        System.out.println("库存已满");
                        try {
                            condition.await();//等待:为了避免虚假唤醒,wait在循环中使用
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    //进货
                    System.out.println("库存" + ++product);
                    condition.signalAll();//唤醒
                }finally{
    
                    lock.unlock();//释放锁
                }
    
    
            }
    
            public  void sale() {//卖货
    
                lock.lock();//加锁
    
                try{
                    while (product <= 0) {
                        System.out.println("库存已空");
                        try {
                            condition.await();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    System.out.println("卖货" + --product);
                    condition.signalAll();
                }finally {
    
                    lock.unlock();//释放锁
    
                }
    
    
            }
        }
    
        static class Productor implements Runnable {
    
            private Clerk clerk;
    
            public Productor(Clerk clerk) {
                this.clerk = clerk;
            }
    
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    try {
                        Thread.sleep(200);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    clerk.get();//消费货物
                }
            }
        }
    
        static class Customer implements Runnable {
    
            private Clerk clerk;
    
            public Customer(Clerk clerk) {
                this.clerk = clerk;
            }
    
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
    
                    clerk.sale();//消费货物
                }
            }
        }
    
    
    }
  • 相关阅读:
    Struts2拦截器的底层实现(AOP思想)
    JFreeChart的使用
    struts2与servlet的耦合
    谷歌地图:使用多边形自动形成类PolygonCreator
    struts2 中的 addActionError 、addFieldError、addActionMessage方法的区别
    Struts2的声明式异常处理
    Java synchronized 详解
    [转载]C# 编写SQL SERVER 2005 的存储过程
    调试基于clr管理的sqlserver存储过程
    sqlserver中调用.net中的dll
  • 原文地址:https://www.cnblogs.com/kaibing/p/9258160.html
Copyright © 2011-2022 走看看