zoukankan      html  css  js  c++  java
  • 【多线程】--生产者消费者模式--Lock版本

    在JDK1.5发布后,提供了Synchronized的更优解决方案:Lock 和 Condition

    我们使用这些新知识,来改进例子:【多线程】--生产者消费者模式--Synchronized版本

    改进代码如下:

    package com.shindo.java.thread;
    import java.util.concurrent.locks.*;
    /**
     * Jdk 1.5中,提供了多线程升级解决办法
     * 将同步Synchronized 替换为显示的Lock操作
     * 将Object中的wait、notify、notifyAll替换为Condition对象
     * 该对象通过Lock锁进行获取
     * 一个锁Lock上可以有多个相关的Condition对象
     */
    public class ProducerAndConsumerPatternBetter {
        public static void main(String[] args){
            Resource2 r = new Resource2();
            new Thread(new Producer2(r)).start();
            new Thread(new Consumer2(r)).start();
        }
    }
    
    /**
     * 定义资源类,负责提供商品的生产方法和消费方法
     */
    class Resource2 {
        //定义商品变量
        private String name;
        //定义自增长计数器
        private int count = 1;
        //定义逻辑标志位
        private boolean flag = false;
        //通过多态的方法,生成Lock对象的实例
        private Lock lock = new ReentrantLock();
        //定义生产者的Condition对象
        private Condition condition_pro = lock.newCondition();
        //定义消费者的Condition对象
        private Condition condition_con = lock.newCondition();
        
        //定义产品生产方法
        public void set(String name) throws InterruptedException{
            lock.lock();
            try {
                while(flag)
                    condition_pro.await();
                this.name = name + "=="+ count++;
                System.out.println(Thread.currentThread().getName() + "--生产者--"+ this.name);
                flag = true;
                condition_con.signal();
            }finally{
                lock.unlock();
            }
        }
        
        //定义产品消费方法
        public void out()throws InterruptedException{
            lock.lock();
            try {
                while(!flag)
                    condition_con.await();
                System.out.println(Thread.currentThread().getName()+"--##消费者##--"+this.name);
                flag = false;
                condition_pro.signal();
            } finally{
                lock.unlock();
            }
        }
    }
    
    /**
     * 定义产品生产类 
     */
    class Producer2 implements Runnable{
        private Resource2 res;
        Producer2(Resource2 res){
            this.res = res;
        }
        public void run(){
            while(true){
                try {
                    res.set("商品");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    //定义产品消费类
    class Consumer2 implements Runnable{
        private Resource2 res;
        Consumer2(Resource2 res){
            this.res = res;
        }
        public void run(){
            while(true){
                try {
                    res.out();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    代码执行结果如下图:

  • 相关阅读:
    Python split()方法分割字符串
    Python创建线程
    Python find()方法
    webpack中‘vant’全局引入和按需引入【vue-cli】
    webpack中‘mint-ui’全局引入和按需引入【vue-cli】
    nginx中 处理post方式打开页面的报错405
    nginx中 vue路由去掉#后的配置问题
    webpack中 VUE使用搜狐ip库查询设备ip地址
    webpack中 VUE使用百度地图获取地理位置
    VUE动态设置网页head中的title
  • 原文地址:https://www.cnblogs.com/shindo/p/5313414.html
Copyright © 2011-2022 走看看