黑马程序员技术交流社区

标题: 多线程同步疑问 [打印本页]

作者: fatesabering    时间: 2014-12-12 02:28
标题: 多线程同步疑问
毕老师视频中的一个例子,我稍微改了下,结果不太对,请各位大神帮忙看看问题出在哪
  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. }
复制代码


作者: fatesabering    时间: 2014-12-12 02:37
我不明白的是为什么打印结果中生产者后面没有个数,只有消费者后面有
作者: Quasimodo    时间: 2014-12-12 04:29
你set方法里面有一句 this.name=name+":"+count++;
    消费者里的name是这里的 this.name  所以会有count
    而生产者后面跟的name是传参进来的name  所以就没有个数
     你把打印生产者的那句的name改成this.name就有个数了
作者: fatesabering    时间: 2014-12-12 11:37
Quasimodo 发表于 2014-12-12 04:29
你set方法里面有一句 this.name=name+":"+count++;
    消费者里的name是这里的 this.name  所以会有count
...

原来如此,我明白了,竟然是这里出了问题。亏我想了半天,Σ( ° △ °|||)︴




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2