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();
                }
            }
        }
    }

    代码执行结果如下图:

  • 相关阅读:
    华为"128为大整数相加"机试题
    ORA-12545: 因目标主机或对象不存在, 连接失败
    VS2010 安装使用STLPort
    Debian 入门安装与配置1
    CF1072A Palindromic Twist 思维
    解决让刷新页面时不提示 "重试或取消”对话框
    php优化及高效提速问题小结
    让Tomcat支持php
    Php邮件发送源码
    使用iconv提示未知错误
  • 原文地址:https://www.cnblogs.com/shindo/p/5313414.html
Copyright © 2011-2022 走看看