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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 地狱天堂 中级黑马   /  2014-8-27 20:41  /  1227 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 地狱天堂 于 2014-8-27 20:48 编辑

我写的代码,运行后先有消费,再有生产,哪出问题了?看了半天没找出来
  1. import java.util.concurrent.locks.Condition;
  2. import java.util.concurrent.locks.Lock;
  3. import java.util.concurrent.locks.ReentrantLock;

  4. public class TestEveryDay {
  5.         public static void main(String[] args) {
  6.                 Res r=new Res();
  7.                 Producer pro=new Producer(r);
  8.                 Consume com=new Consume(r);
  9.                
  10.                 new Thread(pro).start();
  11.                 new Thread(com).start();
  12.         }
  13. }
  14. class Res{
  15.         private String name;
  16.         private int num=1;
  17.         private boolean flag=false;
  18.         private Lock lock=new ReentrantLock();
  19.         private Condition condition_pro=lock.newCondition();
  20.         private Condition condition_con=lock.newCondition();
  21.         
  22.         public void set(String name) throws InterruptedException{
  23.                 lock.lock();               
  24.                 try {
  25.                         while(flag)
  26.                                 condition_pro.await();
  27.                         this.name=name;
  28.                         System.out.println(Thread.currentThread().getName()+":生产者:"+name+num++);
  29.                         flag=true;
  30.                         condition_con.signal();
  31.                 } finally{
  32.                         lock.unlock();
  33.                 }               
  34.         }
  35.         public void out() throws InterruptedException{
  36.                 lock.lock();
  37.                 try{
  38.                         while(!flag)
  39.                                 condition_con.await();
  40.                         System.out.println(Thread.currentThread().getName()+":消费者...."+name+num);
  41.                         flag=false;
  42.                         condition_pro.signal();
  43.                 }finally{
  44.                         lock.unlock();
  45.                 }        
  46.         }
  47.         
  48. }
  49. class Producer implements Runnable{
  50.         private Res r;
  51.         public Producer(Res r){
  52.                 this.r=r;
  53.         }
  54.         public void run() {
  55.                 while(true){
  56.                         try {
  57.                                 r.set("商品");
  58.                         } catch (InterruptedException e) {
  59.                                 e.printStackTrace();
  60.                         }
  61.                 }
  62.         }        
  63. }

  64. class Consume implements Runnable{
  65.         private Res r;
  66.         public Consume(Res r){
  67.                 this.r=r;
  68.         }
  69.         public void run() {
  70.                 while(true){
  71.                         try {
  72.                                 r.out();
  73.                         } catch (InterruptedException e) {
  74.                                 e.printStackTrace();
  75.                         }
  76.                 }
  77.         }        
  78. }


复制代码
运行结果:
Thread-1:消费者....商品52831
Thread-0:生产者:商品52831
Thread-1:消费者....商品52832
Thread-0:生产者:商品52832

4 个回复

倒序浏览
本帖最后由 天黑偷牛 于 2014-8-27 20:48 编辑


错在这里,你应该先让num生产完了再打印,这样的话就是先打印,再执行++,就是这样,要么把num++放到输出语句前面,要么改成++num
回复 使用道具 举报
问题已找到。。。
num++ 放在打印里了
所以生产的时候打印是num,
消费的时候打印num+1了。
回复 使用道具 举报
天黑偷牛 发表于 2014-8-27 20:46
错在这里,你应该先让num生产完了再打印,这样的话就是先打印,再执行++,就是这样,要么把num++放到输出 ...

嗯,你还看得真快。
回复 使用道具 举报
地狱天堂 发表于 2014-8-27 20:50
嗯,你还看得真快。

碰巧看到,嘿嘿
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马