zoukankan      html  css  js  c++  java
  • Java 学习笔记 使用并发包ReentrantLock简化生产者消费者模式代码

    说明

    ReentrantLock是java官方的一个线程锁类,ReentarntLock实现了Lock的接口
    我们只需要使用这个,就可以不用使用synchronized同步关键字以及对应的notifyall方法和wait方法去写我们的生产者消费者模式。
    这样就可以大大简化我们的代码

    代码

    Producer.java

    package producterandcustomer;
    
    import java.util.List;
    import java.util.concurrent.locks.Lock;
    
    /**
     * @author StarsOne
     * @date Create in  2019-4-13 0013 14:51:21
     * @description
     */
    class Producter extends Thread {
        List<Object> warehouse;
        private String name;
        Lock lock;
    
        public Producter(List<Object> warehouse, String name, Lock lock) {
            this.warehouse = warehouse;
            this.name = "生产者" + name;
            //多态,ReentarntLock实现了Lock的接口,所以可以传进来
            this.lock = lock;
    
        }
    
        @Override
        public void run() {
            while (true) {
                //加锁
                lock.lock();
                try {
                    if (warehouse.size() < 10) {
                        warehouse.add(new Object());
                        System.out.println(name + "生产1件" + "当前仓库有" + warehouse.size() + "件");
                    }
                } finally {
                    //解锁
                    lock.unlock();
                }
    
                try {
                    sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    

    Consumer.java

    package producterandcustomer;
    
    import java.util.List;
    import java.util.concurrent.locks.Lock;
    
    /**
     * @author StarsOne
     * @date Create in  2019-4-13 0013 14:51:21
     * @description
     */
    class Cuotmer extends Thread{
        List<Object> warehouse;
        private String name;
        Lock lock;
    
        public Cuotmer(List<Object> warehouse, String name, Lock lock) {
            this.warehouse = warehouse;
            this.name = "消费者"+name;
            this.lock = lock;
        }
    
        @Override
        public void run() {
            while (true) {
                //加锁
                lock.lock();
                try {
                    if (warehouse.size() > 0) {
                        warehouse.remove(0);
                        System.out.println(name+"消费1件"+"当前仓库有"+warehouse.size()+"件");
                    }
                }finally {
                    //最后释放
                    lock.unlock();
                }
    
                try {
                    sleep(200);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    

    Test.java

    package producterandcustomer;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    /**
     * @author StarsOne
     * @date Create in  2019-4-13 0013 14:57:26
     * @description
     */
    class Test {
        public static void main(String[] args) {
            List<Object> warehouse = new ArrayList<>();
            Lock lock = new ReentrantLock();
            new Cuotmer(warehouse, "小米", lock).start();
            new Cuotmer(warehouse, "小蓝", lock).start();
            new Cuotmer(warehouse, "小浩", lock).start();
            new Cuotmer(warehouse, "小家", lock).start();
            new Cuotmer(warehouse, "小留", lock).start();
    
            new Producter(warehouse, "小一", lock).start();
            new Producter(warehouse, "小二", lock).start();
            new Producter(warehouse, "小香", lock).start();
            new Producter(warehouse, "小叫", lock).start();
            new Producter(warehouse, "小三", lock).start();
    
    
        }
    }
    
    
  • 相关阅读:
    实验一:初步认识程序在内存中运行
    读了 东方学帝 的 《薛定谔方程和狄拉克方程等在共量子论中处于什么地位?》
    别跟我说 正电子 是 狄拉克方程 推导 出来 的
    ∫ 1 / ( b / x
    我很好奇 俄罗斯 小哥 数学家 为 华为 解决 的 数学问题 是 什么
    对 潮汐 现象 的 计算机 程序 模拟
    二阶微分 没有意义, 二阶导数 才有意义
    关于 郭峰君 的 d ( x² + y² + z² ) = d ( c² t² )
    圆面积 公式 推导
    理论模型 和 计算能力
  • 原文地址:https://www.cnblogs.com/stars-one/p/10710857.html
Copyright © 2011-2022 走看看