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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马林康 中级黑马   /  2012-6-16 11:37  /  1689 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

写的代码输出和期望 的刚好相反,分析了半天也没看出哪里错了 求高手分析一下
  1. import java.util.concurrent.locks.*;
  2. class ThreadDemo5
  3. {
  4. public static void main(String[] args)
  5. {
  6. Resource r=new Resource();
  7. Producer p=new Producer(r);
  8. Customer c=new Customer(r);
  9. new Thread(p,"生产者NO.1").start();
  10. new Thread(p,"生产者NO.2").start();
  11. new Thread(c,"消费者NO.1").start();
  12. new Thread(c,"消费者NO.2").start();
  13. }
  14. }
  15. class Resource
  16. {
  17. private String name;
  18. private int count=1;
  19. private boolean flags=false;
  20. private Lock lock=new ReentrantLock();
  21. private Condition condition_Pro =lock.newCondition();
  22. private Condition condition_Cus=lock.newCondition();
  23. public void set(String name)throws InterruptedException
  24. {
  25. lock.lock();
  26. this.name=name+"----"+count++;
  27. try
  28. {
  29. while(flags)
  30. condition_Pro.await();
  31. System.out.println(Thread.currentThread().getName()+"...生产了..."+this.name);
  32. flags=true;
  33. condition_Cus.signal();
  34. }
  35. finally
  36. {
  37. lock.unlock();
  38. }

  39. }
  40. public void get()throws InterruptedException
  41. {
  42. lock.lock();
  43. try
  44. {
  45. while(!flags)
  46. condition_Cus.await();
  47. System.out.println(Thread.currentThread().getName()+"......消费了......"+this.name);
  48. flags=false;
  49. condition_Pro.signal();
  50. }
  51. finally
  52. {
  53. lock.unlock();
  54. }

  55. }
  56. }
  57. class Producer implements Runnable
  58. {
  59. private Resource r;
  60. Producer(Resource r)
  61. {
  62. this.r=r;
  63. }
  64. public void run()
  65. {
  66. while (true)
  67. {
  68. try
  69. {
  70. r.set("商品");
  71. }
  72. catch (InterruptedException e)
  73. {
  74. e.printStackTrace();
  75. }
  76. }
  77. }

  78. }
  79. class Customer implements Runnable
  80. {
  81. private Resource r;
  82. Customer(Resource r)
  83. {
  84. this.r=r;
  85. }
  86. public void run()
  87. {
  88. while(true)
  89. {
  90. try
  91. {
  92. r.get();
  93. }
  94. catch (InterruptedException e)
  95. {
  96. e.printStackTrace();
  97. }
  98. }

  99. }
  100. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

7 个回复

正序浏览
我在上面的代码中做了修改和添加了注释说明!问题应该就清楚。
回复 使用道具 举报
  1. import java.util.concurrent.locks.*;

  2. class ThreadDemo5 {
  3.         public static void main(String[] args) {
  4.                 Resource r = new Resource();
  5.                 Producer p = new Producer(r);
  6.                 Customer c = new Customer(r);
  7.                 new Thread(p, "生产者NO.1").start();
  8.                 new Thread(p, "生产者NO.2").start();
  9.                 new Thread(c, "消费者NO.1").start();
  10.                 new Thread(c, "消费者NO.2").start();
  11.         }
  12. }

  13. class Resource {
  14.         private String name;
  15.         private int count = 1;
  16.         private boolean flags = false;//false 没有商品   true 有商品
  17.                                                                                
  18.         private Lock lock = new ReentrantLock();
  19.         private Condition condition_Pro = lock.newCondition();
  20.         private Condition condition_Cus = lock.newCondition();
  21.        
  22.         public void set(String name) throws InterruptedException {
  23.                 lock.lock();
  24. //                this.name = name + "----" + count++;
  25.                 try {
  26.                         while (flags) // 有商品就等待
  27.                                 condition_Pro.await();
  28.                         // 应该等到没有商品再做生产,而不是在上面没有判断有没有商品前就生产了
  29.                         this.name = name + "----" + count++;
  30.                        
  31.                         System.out.println(Thread.currentThread().getName() + "...生产了..."
  32.                                         + this.name);
  33.                         flags = true;// 设置成有商品就等待
  34.                         condition_Cus.signal();
  35.                 } finally {
  36.                         lock.unlock();
  37.                 }

  38.         }

  39.         public void get() throws InterruptedException {
  40.                 lock.lock();
  41.                 try {
  42.                         while (!flags) // 没有商品就等待
  43.                                 condition_Cus.await();
  44.                         System.out.println(Thread.currentThread().getName()
  45.                                         + "......消费了......" + this.name);
  46.                         flags = false; // 消费完成
  47.                         condition_Pro.signal();
  48.                 } finally {
  49.                         lock.unlock();
  50.                 }

  51.         }
  52. }

  53. class Producer implements Runnable {
  54.         private Resource r;

  55.         Producer(Resource r) {
  56.                 this.r = r;
  57.         }

  58.         public void run() {
  59.                 while (true) {
  60.                         try {
  61.                                 r.set("商品");
  62.                         } catch (InterruptedException e) {
  63.                                 e.printStackTrace();
  64.                         }
  65.                 }
  66.         }

  67. }

  68. class Customer implements Runnable {
  69.         private Resource r;

  70.         Customer(Resource r) {
  71.                 this.r = r;
  72.         }

  73.         public void run() {
  74.                 while (true) {
  75.                         try {
  76.                                 r.get();
  77.                         } catch (InterruptedException e) {
  78.                                 e.printStackTrace();
  79.                         }
  80.                 }

  81.         }
  82. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
孙峰 发表于 2012-6-16 12:41
你也自己运行下试试再往上放,这不还是原代码

刚才放错了,现在改过来了
回复 使用道具 举报
李盼 发表于 2012-6-16 12:19
import java.util.concurrent.locks.*;
class ThreadDemo5{
        public static void main(String[] args)

你也自己运行下试试再往上放,这不还是原代码
回复 使用道具 举报
本帖最后由 李盼 于 2012-6-16 12:52 编辑

import java.util.concurrent.locks.*;
class ThreadDemo5{
        public static void main(String[] args)
        {
                Resource r=new Resource();
                Producer p=new Producer(r);
                Customer c=new Customer(r);
                new Thread(p,"生产者NO.1").start();
                new Thread(p,"生产者NO.2").start();
                new Thread(c,"消费者NO.1").start();
                new Thread(c,"消费者NO.2").start();
        }
}

class Resource{
        private String name;
        private int count=1;
        private boolean flags=false;
        private Lock lock=new ReentrantLock();
        private Condition condition_Pro =lock.newCondition();
        private Condition condition_Cus=lock.newCondition();
        public void set(String name)throws InterruptedException
        {
                lock.lock();
                //       this.name=name+"----"+count++;  这句放在这里不妥,因为这次是真正的生成,下面只是打印。如果值为ture,下面执行到while语句,进程就会休息,
               //但是此时count已经增加了,this.name已经改变了,东西已经被生成出来了,只是没有打印,那么消费者拿到线程后,就把它打印出来了,然后消费者休息,这个线程苏
            //醒,是从上次停止的地方开始执行,那么就是下面直接打印了,这就造成了显示效果的错误
                try
                {
                        while(flags)
                        
                        condition_Pro.await();

                         this.name=name+"----"+count++;
                        System.out.println(Thread.currentThread().getName()+"...生产了..."+this.name);
                        
                        flags=true;
                        condition_Cus.signal();
                        
                }
                finally
                {
                        lock.unlock();
                }
        }
        public void get()throws InterruptedException{
                lock.lock();
                try
                {
                        while(!flags)
                        
                        condition_Cus.await();
                        System.out.println(Thread.currentThread().getName()+"......消费了......"+this.name);
                        
                        flags=false;
                        condition_Pro.signal();
                        
                }
                finally
                {
                        lock.unlock();
                }
        }
}

class Producer implements Runnable{
        private Resource r;         
        Producer(Resource r)         
        {         
                this.r=r;         
        }         
        public void run()         
        {         
                while (true)         
        {         
        try         
        {         
                r.set("商品");         
        }         
        catch (InterruptedException e)         
        {         
                e.printStackTrace();         
        }         
        }
         
        }
}

class Customer implements Runnable {
        private Resource r;
        Customer(Resource r)
        {
                this.r=r;
        }
        public void run()
        {
                while(true)
                {
                        try
                        {
                                r.get();
                        }
                        catch (InterruptedException e)
                        {
                                e.printStackTrace();
                        }
                }
        }
}


还有强烈鄙视楼主的代码不按格式来,读的太痛苦了!

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
Forever。 发表于 2012-6-16 11:48
您的意思是不是生产者1对应消费者1??

消费者NO.1......消费了......商品----3495
生产者NO.2...生产了...商品----3495
消费者NO.2......消费了......商品----3496
生产者NO.1...生产了...商品----3496
消费者NO.1......消费了......商品----3497
生产者NO.2...生产了...商品----3497
消费者NO.2......消费了......商品----3498
生产者NO.1...生产了...商品----3498
消费者NO.1......消费了......商品----3499
生产者NO.2...生产了...商品----3499

先消费了 后生产
回复 使用道具 举报
您的意思是不是生产者1对应消费者1??
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马