下面这段程序是我模拟生产者与消费者的的,不过还没写完,就写了这一点我就有点不理解,请教了?
public class ProducerTest {
public static void main(String[]args)
{
Queue q=new Queue();
Producer t1=new Producer(q);
Consumer t2=new Consumer(q);
t1.start();
t2.start();
}
}
class Producer extends Thread
{
Queue q;
public Producer(Queue q)
{
this.q=q;
}
public void run()
{
for(int i=0;i<10;i++)
{
//System.out.println("qqqq");
q.put(i);
System.out.println("Producer put:"+i);
}

}
}
class Consumer extends Thread
{
Queue q;
public Consumer(Queue q)
{
this.q=q;
}
public void run()
{
while(true)
{
System.out.println("Consumer get:"+q.get());
}
}
}
class Queue
{
int value;
public void put(int i)
{
value=i;
}
public int get()
{
return value;
}
}
结果打印的全是:
Consumer get:9
Consumer get:9
Consumer get:9
Consumer get:9为什么下面这段语句不打印出来,打印结果出现9,说明q.put(i)这段语句执行了,为什么后面那个输出语句就是不执行呢,我在它前面也加了一句测试一下,可结果也没打出来,这就有点奇怪了,请教了?

解决方案 »

  1.   

    你的循环执行的太快了,当你看到Consumer get:9这句出现的时候,其实前面已经有大量的信息打印出来,并且都已经超过输出缓冲区了,所以你看不到。
    在每次输出后,让线程睡眠一会儿,你就看到了。
      

  2.   

    Consumer那里有死循环,所以后面全是打印9(Producer把i加到9就退出了)
    因为一个屏幕显示不了所有结果所以你最后看到的就全是Consumer在那打印的结果了看来你还没有真正懂得生产者消费者模型:有一种是有限buffer的,还一种是无限buffer的(生产者可以随意往buffer中放东西,但这个并不实际,因为内存不会无限大,所以后者一般不讨论),无论是哪种情况,生产者与消费者之间都必须实现同步与互斥,只有buffer有空闲的空间时才能往里面放数据,只有buffer中有数据的时候才能从里面读取数据,它们对buffer的访问都是互斥的。我想这些在LZ的程序中都没有得到体现。程序就不给你写了,网上台多了。
    put与get都要synchronized修饰,假设buffer为n(你可以自己要个数组当作buffer),大概框架可以这样:
    public synchronized void put() {
      while(buffer >=n){
         wait();
      }
      //生产一条数据放到buffer中,buffer的空闲空间减一
      notifyAll();//唤醒在等待的线程(Consumer可能因为之前buffer中没有数据而阻塞等待)
    }public synchronized Object get() {
       while(buffer <= 0) {
          wait();
       }
       //get a data from buffer,buffer多出一个空闲空间
       notifyAll();//有可能有Producer刚才因为buffer满而阻塞等待
    }