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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© fatesabering 中级黑马   /  2014-12-12 02:28  /  1258 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

毕老师视频中的一个例子,我稍微改了下,结果不太对,请各位大神帮忙看看问题出在哪
  1. package java01;
  2. import java.util.concurrent.locks.*;

  3. class Resource
  4. {
  5.         private String name;
  6.         private boolean flag=false;
  7.         private int count=0;
  8.         Lock lock = new ReentrantLock();
  9.         Condition pro = lock.newCondition();
  10.         Condition con = lock.newCondition();
  11.        
  12.         public void set(String name)
  13.         {
  14.                 lock.lock();
  15.                 if(flag)
  16.                         try{pro.await();}catch(Exception e){}
  17.                 this.name=name+":"+count++;
  18.                 System.out.println(Thread.currentThread().getName()+" 生产者 "+name);
  19.                 flag=true;
  20.                 con.signal();
  21.                 lock.unlock();
  22.         }
  23.         public void out()
  24.         {
  25.                 lock.lock();
  26.                 if(!flag)
  27.                         try{con.await();}catch(Exception e){}
  28.                 System.out.println(Thread.currentThread().getName()+" 消费者 "+name);
  29.                 flag=false;
  30.                 pro.signal();
  31.                 lock.unlock();
  32.         }
  33. }
  34. class Producer implements Runnable
  35. {
  36.         private Resource r;
  37.         Producer(Resource r)
  38.         {
  39.                 this.r=r;
  40.         }
  41.         public void run()
  42.         {
  43.                 while(true)
  44.                 {
  45.                         r.set("真夜");
  46.                 }
  47.         }
  48. }
  49. class Consumer implements Runnable
  50. {
  51.         private Resource r;
  52.         Consumer(Resource r)
  53.         {
  54.                 this.r=r;
  55.         }
  56.         public void run()
  57.         {
  58.                 while(true)
  59.                 {
  60.                         r.out();
  61.                 }
  62.         }
  63. }
  64. public class day1212 {
  65.         public static void main(String[] args) {
  66.                 Resource r = new Resource();
  67.                 new Thread(new Producer(r)).start();
  68.                 new Thread(new Producer(r)).start();
  69.                 new Thread(new Consumer(r)).start();
  70.                 new Thread(new Consumer(r)).start();
  71.         }
  72. }
复制代码

3 个回复

倒序浏览
我不明白的是为什么打印结果中生产者后面没有个数,只有消费者后面有
回复 使用道具 举报
你set方法里面有一句 this.name=name+":"+count++;
    消费者里的name是这里的 this.name  所以会有count
    而生产者后面跟的name是传参进来的name  所以就没有个数
     你把打印生产者的那句的name改成this.name就有个数了
回复 使用道具 举报 1 0
Quasimodo 发表于 2014-12-12 04:29
你set方法里面有一句 this.name=name+":"+count++;
    消费者里的name是这里的 this.name  所以会有count
...

原来如此,我明白了,竟然是这里出了问题。亏我想了半天,Σ( ° △ °|||)︴
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马