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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 一帆风顺 中级黑马   /  2012-12-8 16:59  /  1947 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王博 于 2012-12-11 08:06 编辑

/*生产者,消费者*/

class  SynchronizedE
{
       public static void main(String[] args)
       {
              SyncStack stack = new SyncStack();
              Runnable source = new Producer(stack);
              Runnable sink = new Consumer(stack);
              Thread t1 = new Thread(source);
              Thread t2 = new Thread(sink);
              t1.start();
              t2.start();
              System.out.println("Hello World!");
       }
}
class Producer implements Runnable
{
       SyncStack theStack;
       public Producer(SyncStack s)
       {
              theStack = s;
       }
       public void run()
       {
              char c;
              for (int i=0;i<6 ;i++ )
              {
                     c = (char)(Math.random()*26+'A');
                     theStack.push(c);
                     System.out.print("生产者生产:"+c+",");
                     try
                     {
                            Thread.sleep((int)(Math.random()*100));
                     }
                     catch (InterruptedException e){}
              }
       }
}
class Consumer implements Runnable
{
       SyncStack theStack;
       public Consumer(SyncStack s)
       {
              theStack = s;
       }
       public void run()
       {
              char c;
              for (int i=0;i<6 ;i++ )
              {
                     c = theStack.pop();
                     System.out.print("消费者消费:"+c);
                     try
                     {
                            Thread.sleep((int)(Math.random()*1000));
                     }
                     catch (InterruptedException e){}
              }
       }
}
class SyncStack
{
       private int index = 0;
       private char buffer[] = new char[6];
       public  void push(char c)
       {
              while(index == buffer.length)
              {
                     synchronized(this)
                     {
                            try
                            {
                                   this.wait();
                            }
                            catch (InterruptedException e){}
                     
                     }
                     
              }
              this.notify();
              buffer[index] = c;
              index++;
       }
       public synchronized char pop()
       {
              while (index==0)
              {
                     try
                     {
                            this.wait();
                     }
                     catch (InterruptedException e){}
              }
              this.notify();
              index--;
              return buffer[index];
       }
}

为什么运行通不过啊???求解,哪里有问题??

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 神马都是浮云

查看全部评分

1 个回复

倒序浏览
应该是唤醒没有同步问题 不知道我说的对不对, 你这个代码 我还不怎么看的懂
       private int index = 0;
       private char buffer[] = new char[6];
       public  void push(char c)
       {
              while(index == buffer.length)
              {
                     synchronized(this)
                     {
                            try
                            {
                                   this.wait();
                            }
                            catch (InterruptedException e){}
                     
                     }
                     
              }
              this.notify(); 这句话应该放在同步代码块里
              buffer[index] = c;
              index++;
       }
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马