下面这段程序是我模拟生产者与消费者的的,不过还没写完,就写了这一点我就有点不理解,请教了?
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)这段语句执行了,为什么后面那个输出语句就是不执行呢,我在它前面也加了一句测试一下,可结果也没打出来,这就有点奇怪了,请教了?
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)这段语句执行了,为什么后面那个输出语句就是不执行呢,我在它前面也加了一句测试一下,可结果也没打出来,这就有点奇怪了,请教了?
在每次输出后,让线程睡眠一会儿,你就看到了。
因为一个屏幕显示不了所有结果所以你最后看到的就全是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满而阻塞等待
}