黑马程序员技术交流社区

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

作者: 一帆风顺    时间: 2012-12-8 16:59
标题: 多线程之生产者和消费者的问题
本帖最后由 王博 于 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];
       }
}

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

作者: 惠晖    时间: 2012-12-8 19:05
应该是唤醒没有同步问题 不知道我说的对不对, 你这个代码 我还不怎么看的懂
       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++;
       }





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