黑马程序员技术交流社区

标题: 多线程-生产者消费者的问题 [打印本页]

作者: optimisticpig    时间: 2014-4-14 22:18
标题: 多线程-生产者消费者的问题
  1. import java.util.concurrent.locks.*;

  2. class ProducerConsumerDemo2
  3. {
  4.         public static void main(String[] args)
  5.         {
  6.                 Resource res = new Resource();

  7.                 Producer pro = new Producer(res);
  8.                 Consumer con = new Consumer(res);

  9.                 Thread t1 = new Thread(pro);
  10.                 Thread t2 = new Thread(pro);
  11.                 Thread t3 = new Thread(con);
  12.                 Thread t4 = new Thread(con);
  13.                 t1.start();
  14.                 t2.start();
  15.                 t3.start();
  16.                 t4.start();
  17.         }
  18. }
  19. class Resource
  20. {
  21.         private String name;
  22.         private int count = 1;
  23.         private boolean flag = false;
  24.         //多态。创建锁。
  25.         private Lock lock = new ReentrantLock();
  26.         //调用lock的newCondition方法,获得condition对象。
  27.         private Condition condition = lock.newCondition();

  28.         public  void set(String name)throws InterruptedException
  29.         {
  30.                 lock.lock();
  31.                 try
  32.                 {
  33.                         while(flag)
  34.                                 condition.await();//等待状态。
  35.                         this.name = name+"---"+count++;
  36.                         System.out.println(Thread.currentThread().getName()+"---消费者---"+this.name);
  37.                         flag = true;
  38.                         condition.signalAll();//唤醒线程。
  39.                 }
  40.                 finally
  41.                 {
  42.                         lock.unlock();
  43.                 }               
  44.         }
  45.         public  void out()throws InterruptedException
  46.         {
  47.                 lock.lock();
  48.                 try
  49.                 {                       
  50.                         while(!flag)
  51.                                 condition.await();
  52.                         System.out.println(Thread.currentThread().getName()+"---生产者---"+this.name );
  53.                         flag = false;
  54.                         condition.signalAll();                       
  55.                 }
  56.                 finally
  57.                 {
  58.                         lock.unlock();
  59.                 }               
  60.         }
  61. }
  62. class Producer implements Runnable
  63. {
  64.         private Resource res;
  65.         Producer(Resource res)
  66.         {
  67.                 this.res = res;
  68.         }
  69.         public void run()
  70.         {
  71.                 while(true)
  72.                 {
  73.                         try
  74.                         {
  75.                                 res.set("|商品|");
  76.                         }
  77.                         catch (InterruptedException e)
  78.                         {
  79.                         }                       
  80.                 }
  81.         }
  82. }
  83. class Consumer implements Runnable
  84. {
  85.         private Resource res;
  86.         Consumer(Resource res)
  87.         {
  88.                 this.res = res;
  89.         }
  90.         public void run()
  91.         {
  92.                 while (true)
  93.                 {
  94.                         try
  95.                         {
  96.                                 res.out();
  97.                         }
  98.                         catch (InterruptedException e)
  99.                         {
  100.                         }                       
  101.                 }
  102.         }
  103. }
复制代码


编译时产生6个问题。
-------------------------------------------------------
ProducerConsumerDemo2.java:32: 不兼容的类型
找到: java.util.concurrent.locks.ReentrantLock
需要: Lock
        private Lock lock = new ReentrantLock();
                            ^
ProducerConsumerDemo2.java:34: 找不到符号
符号: 方法 newCondition()
位置: 类 Lock
        private Condition condition = lock.newCondition();
                                          ^
ProducerConsumerDemo2.java:38: 找不到符号
符号: 方法 lock()
位置: 类 Lock
                lock.lock();
                    ^
ProducerConsumerDemo2.java:50: 找不到符号
符号: 方法 unlock()
位置: 类 Lock
                        lock.unlock();
                            ^
ProducerConsumerDemo2.java:55: 找不到符号
符号: 方法 lock()
位置: 类 Lock
                lock.lock();
                    ^
ProducerConsumerDemo2.java:66: 找不到符号
符号: 方法 unlock()
位置: 类 Lock
                        lock.unlock();
                            ^
6 错误
-------------------------------------------------
但是把import java.util.concurrent.locks.*;
换成:import java.util.concurrent.locks.Lock;
         import java.util.concurrent.locks.ReentrantLock;
         import java.util.concurrent.locks.Condition;
就没有问题。

这时什么原因呢?

作者: 呆呆沙师妹    时间: 2014-4-15 09:13
两种导入包的方式没有差别呀,没出现你说的编译问题。
作者: optimisticpig    时间: 2014-4-15 20:28
呆呆沙师妹 发表于 2014-4-15 09:13
两种导入包的方式没有差别呀,没出现你说的编译问题。

我用的是Editplus编译运行的




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