A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 耿渊博 中级黑马   /  2014-3-25 22:31  /  870 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 耿渊博 于 2014-3-25 23:17 编辑

下面代码可以实现带锁的生产者消费者问题吗?
  1. package com.Thread;

  2. import java.util.concurrent.locks.Condition;
  3. import java.util.concurrent.locks.Lock;
  4. import java.util.concurrent.locks.ReentrantLock;




  5. public class ProducerConsumerDemo {

  6.         public static void main(String[] args) {
  7.                 // TODO Auto-generated method stub
  8.                
  9.                 Resource r = new Resource();
  10.                 Producer pro = new Producer(r);
  11.                 Consume con = new Consume(r);
  12.                
  13.                 Thread t1 = new Thread(pro);
  14.                 Thread t2 = new Thread(pro);
  15.                 Thread t3 = new Thread(con);
  16.                 Thread t4 = new Thread(con);
  17.                
  18.                 t1.start();
  19.                 t2.start();
  20.                 t3.start();
  21.                 t4.start();
  22.         }

  23. }
  24. class Resource{
  25.         private String name;
  26.         private int count = 1;
  27.         private boolean flag = false;
  28.         private Lock lock = new ReentrantLock();
  29.         private Condition condition = lock.newCondition();
  30.         
  31.         public  void set(String name)throws InterruptedException{
  32.                 lock.lock();
  33.                 try{
  34.                         while(flag)
  35.                                 condition.await();
  36.                         this.name = name+"--"+count++;
  37.                         System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
  38.                         flag = true;
  39.                         condition.signalAll();
  40.                 }
  41.                 finally{
  42.                 lock.unlock();
  43.                 }
  44.         }
  45.         
  46.         public  void out()throws InterruptedException{
  47.                 lock.lock();
  48.                 try{
  49.                         while(!flag)
  50.                                 condition.await();
  51.                         System.out.println(Thread.currentThread().getName()+"...消费者.............."+this.name);
  52.                         flag = false;
  53.                         condition.signalAll();
  54.                 }finally{
  55.                         lock.unlock();
  56.                 }
  57.         }
  58.         
  59. }

  60. class Producer implements Runnable{
  61. private Resource res;

  62. Producer(Resource res){
  63.         this.res = res;
  64. }
  65. public void run(){
  66.         while(true){
  67.                 try {
  68.                         res.set("+商品+");
  69.                 } catch (InterruptedException e) {
  70.                         // TODO Auto-generated catch block
  71.                         e.printStackTrace();
  72.                 }
  73.         }
  74. }
  75. }

  76. class Consume implements Runnable{
  77. private Resource res;

  78. Consume(Resource res){
  79.         this.res = res;
  80. }
  81. public void run(){
  82.         while(true)
  83.                 try {
  84.                         res.out();
  85.                 } catch (InterruptedException e) {
  86.                         // TODO Auto-generated catch block
  87.                         e.printStackTrace();
  88.                 }
  89. }
  90. }
复制代码


点评

可以搞两个Conditiond对象实现线程间的通信,使用signal方法,而不是signalAll方法...  发表于 2014-3-25 22:39

评分

参与人数 1技术分 +1 收起 理由
itpower + 1

查看全部评分

3 个回复

倒序浏览
你写的这个不太好,唤醒进程时需要分开唤醒。即定义两个condition 变量。我给你改了一下
  1. package com.Thread;

  2. import java.util.concurrent.locks.Condition;
  3. import java.util.concurrent.locks.Lock;
  4. import java.util.concurrent.locks.ReentrantLock;




  5. public class ProducerConsumerDemo {

  6.         public static void main(String[] args) {
  7.                 // TODO Auto-generated method stub
  8.                
  9.                 Resource r = new Resource();
  10.                 Producer pro = new Producer(r);
  11.                 Consume con = new Consume(r);
  12.                
  13.                 Thread t1 = new Thread(pro);
  14.                 Thread t2 = new Thread(pro);
  15.                 Thread t3 = new Thread(con);
  16.                 Thread t4 = new Thread(con);
  17.                
  18.                 t1.start();
  19.                 t2.start();
  20.                 t3.start();
  21.                 t4.start();
  22.         }

  23. }
  24. class Resource{
  25.         private String name;
  26.         private int count = 1;
  27.         private boolean flag = false;
  28.         private Lock lock = new ReentrantLock();
  29.         private Condition condition_pro = lock.newCondition();//消费者
  30.         private Condition condition_con = lock.newCondition();//生产者
  31.        
  32.         public  void set(String name)throws InterruptedException{
  33.                 lock.lock();
  34.                 try{
  35.                         while(flag)
  36.                                 condition_pro.await();//生产者等待
  37.                         this.name = name+"--"+count++;
  38.                         System.out.println(Thread.currentThread().getName()+"...生产者..."+this.name);
  39.                         flag = true;
  40.                         condition_con.signal();//唤醒消费者
  41.                 }
  42.                 finally{
  43.                 lock.unlock();
  44.                 }
  45.         }
  46.        
  47.         public  void out()throws InterruptedException{
  48.                 lock.lock();
  49.                 try{
  50.                         while(!flag)
  51.                                 condition_con.await();//消费者等待
  52.                         System.out.println(Thread.currentThread().getName()+"...消费者.............."+this.name);
  53.                         flag = false;
  54.                         condition_pro.signal();//唤醒生产者
  55.                 }finally{
  56.                         lock.unlock();
  57.                 }
  58.         }
  59.        
  60. }

  61. class Producer implements Runnable{
  62. private Resource res;

  63. Producer(Resource res){
  64.         this.res = res;
  65. }
  66. public void run(){
  67.         while(true){
  68.                 try {
  69.                         res.set("+商品+");
  70.                 } catch (InterruptedException e) {
  71.                         // TODO Auto-generated catch block
  72.                         e.printStackTrace();
  73.                 }
  74.         }
  75. }
  76. }

  77. class Consume implements Runnable{
  78. private Resource res;

  79. Consume(Resource res){
  80.         this.res = res;
  81. }
  82. public void run(){
  83.         while(true)
  84.                 try {
  85.                         res.out();
  86.                 } catch (InterruptedException e) {
  87.                         // TODO Auto-generated catch block
  88.                         e.printStackTrace();
  89.                 }
  90. }
  91. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

回复 使用道具 举报
papercup 发表于 2014-3-25 22:46
你写的这个不太好,唤醒进程时需要分开唤醒。即定义两个condition 变量。我给你改了一下 ...

明白了  
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马