黑马程序员技术交流社区

标题: 关于这个单生产单消费的问题,不用同步,用锁机制如何完成 [打印本页]

作者: dsh    时间: 2014-10-11 21:00
标题: 关于这个单生产单消费的问题,不用同步,用锁机制如何完成
  1. package Thread_02_Produce_Consume;

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

  4. public class Phone {

  5.         //定义手机属性
  6.         String brand;
  7.         String color;
  8.         boolean flag = false;
  9.         //Lock ck = new ReentrantLock();
  10.         public Phone() {
  11.                 super();
  12.         }
  13.         //生产手机应该是手机的功能
  14.         public synchronized void setPhone(String brand,String color ) {
  15.                         //ck.lock();
  16.                         //如果有手機,就等待
  17.                         if(flag){
  18.                                 try {
  19.                                         wait();
  20.                                 } catch (InterruptedException e) {
  21.                                        
  22.                                         e.printStackTrace();
  23.                                 }
  24.                         }
  25.                         //生产手机
  26.                         this.brand=brand;
  27.                         this.color= color;
  28.                         System.out.println(Thread.currentThread().getName()+"生产手机"+brand+"..."+color);
  29.                         //生产完后,更新手机的状态
  30.                         flag= true;
  31.                         //唤醒消费者
  32.                         notify();
  33.         }
  34.                
  35.                

  36.         //消费手机应该是手机的功能
  37.         public synchronized void getPhone() {
  38.                
  39.                         if(!flag){                       
  40.                                 try {
  41.                                         wait();
  42.                                 } catch (InterruptedException e) {                                               
  43.                                         e.printStackTrace();
  44.                                 }
  45.                         }
  46.                         System.out.println(Thread.currentThread().getName()+"消费手机"+brand+"..."+color);       
  47.                         //更新手机的状态
  48.                         flag=false;
  49.                         //唤醒生产者
  50.                         notify();
  51.         }
  52.        
  53. }
复制代码

  1. package Thread_02_Produce_Consume;

  2. public class Consume_Phone implements Runnable {

  3.         Phone p;
  4.        
  5.         public Consume_Phone(Phone p) {
  6.                 this.p = p;
  7.         }
  8.         @Override
  9.         public void run() {

  10.                 while (true) {       
  11.                         p.getPhone();
  12.                 }

  13.         }
  14.        

  15. }
复制代码

  1. package Thread_02_Produce_Consume;
  2. /**
  3. * 需求:单生产单消费
  4. *
  5. * 分析:        生产者类
  6. *                         setPhone();
  7. *                   消费者类
  8. *                         getPhone();
  9. *                  手机类
  10. *                         手机提供者
  11. *                 测试类
  12. *
  13. *
  14. */
  15. public class Produce_Consume {
  16.         public static void main(String[] args) {
  17.                 //创建共享数据源
  18.                 Phone p = new Phone();
  19.                 //创建生产对象
  20.                 Produce_Phone pp = new Produce_Phone(p);
  21.                 //创建消费者对对象
  22.                 Consume_Phone cp = new Consume_Phone(p);

  23.                 //创建线程
  24.                 Thread t1 =new Thread(pp);
  25.                 Thread t2 =new Thread(cp);
  26.                
  27.                 //开启线程
  28.                 t1.start();
  29.                 t2.start();
  30.        
  31.                
  32.         }
  33. }
复制代码

  1. package Thread_02_Produce_Consume;

  2. public class Produce_Phone implements Runnable{
  3.         private Phone p;
  4.         private int num =0;

  5.         public Produce_Phone(Phone p) {
  6.                 this.p = p;
  7.         }
  8.         @Override
  9.         public void run() {
  10.                 while(true){
  11.                         if(num%2==0){
  12.                                 p.setPhone("IPhone", "土豪金");
  13.                         }else{
  14.                                 p.setPhone("小米4", "白色");
  15.                                
  16.                         }
  17.                         num++;
  18.                        
  19.                 }
  20.         }
  21. }
复制代码



作者: hollywood2014    时间: 2014-10-11 21:38
你写的是对的吧我的建议是

public void produce()
{
    lock.lock();
    try
         {
              if(不满足)
                      ...wait();//此时该线程仍然持有锁
              //满足
               生产手机
               将标志取反
               notifyall或者指定某一个与锁绑定的条件唤醒
         }
     catch(InterruptException e)//     wait()可能会有该异常,若不处理,线程便会被中断
      {
          do something
       }
      finally
       {
         lock.unlock();
       }     
}

我也是正在学习这一块,有什么不对的地方还望指正





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