1.生产者-消费者模式实现概述
生产者与消费者模式是我们在编程过程中经常会遇到的,就像我们生活那样,生产者生产出产品,消费者去购买产品。在这里我们创建三个线程,一个主控线程main,用于创建各辅助线程;一个生产者线程,用于生产产品;一个消费者线程,用于购买产品。另外,我们创建一个队列类Queue,生产线程生产的产品将放置到该队列中,然后消费者线程在该队列中取走产品。
2.实现该模式的要点:
首先必须让生产者线程与消费者线程达到同步,也就是说,当生产者线程生产出产品后,消费者才能去取,依此轮回。当生产者线程放置产品到队列中时,队列要检查队列是否已满,如已满,则等待消费者线程将产品取走,否则放置产品到队列中。当消费者线程在队列中取产品时,队列也要检查队列是否为空,如果为空,则等待生产者线程放置产品到队列,否则在队列中取走产品。
3.源代码:
class MainThread
{
public static void main(String[] args)
{
Queue queue=new Queue();
Producer producer=new Producer(queue);
Consumer consumer=new Consumer(queue);
new Thread(producer).start();
new Thread(consumer).start();
}
}
/*注意:wait notify notifyAll只能在同步方法或内步块中调用*/
class Queue
{
int product=0;
boolean bfull=false;
public synchronized void setProduct(int product)
{
if(bfull)//如果队列已满,则调用wait等待消费者取走产品
{
try
{
wait();
}
catch(Exception e)
{
e.printStackTrace();
}
}
/*开始放置产品到队列中*/
this.product=product;
System.out.println("Producer set product:"+product);
bfull=true;
notify();//生产产品后通知消费者取走产品
}
public synchronized void getProduct()
{
if(!bfull)//如果队列是空的,则调用wait等待生产者生产产品
{
try
{
wait();
}
catch(Exception e)
{
e.printStackTrace();
}
}
/*开始从队列取走产品*/
System.out.println("Consumer get product:"+product);
bfull=false;
notify();//取走产品后通知生产者继续生产产品
}
}
class Producer implements Runnable
{
Queue queue;
Producer(Queue queue)
{
this.queue=queue;
}
public void run()//生产线程
{
for(int i=1;i<=10;i++)
{
queue.setProduct(i);
}
}
}
class Consumer implements Runnable
{
Queue queue;
Consumer(Queue queue)
{
this.queue=queue;
}
public void run()//消费线程
{
for(int i=1;i<=10;i++)
{
queue.getProduct();
}
}
}
输出结果如下:
Producer set product:1
Consumer get product:1
Producer set product:2
Consumer get product:2
Producer set product:3
Consumer get product:3
Producer set product:4
Consumer get product:4
Producer set product:5
Consumer get product:5
Producer set product:6
Consumer get product:6
Producer set product:7
Consumer get product:7
Producer set product:8
Consumer get product:8
Producer set product:9
Consumer get product:9
Producer set product:10
Consumer get product:10
生产者与消费者模式是我们在编程过程中经常会遇到的,就像我们生活那样,生产者生产出产品,消费者去购买产品。在这里我们创建三个线程,一个主控线程main,用于创建各辅助线程;一个生产者线程,用于生产产品;一个消费者线程,用于购买产品。另外,我们创建一个队列类Queue,生产线程生产的产品将放置到该队列中,然后消费者线程在该队列中取走产品。
2.实现该模式的要点:
首先必须让生产者线程与消费者线程达到同步,也就是说,当生产者线程生产出产品后,消费者才能去取,依此轮回。当生产者线程放置产品到队列中时,队列要检查队列是否已满,如已满,则等待消费者线程将产品取走,否则放置产品到队列中。当消费者线程在队列中取产品时,队列也要检查队列是否为空,如果为空,则等待生产者线程放置产品到队列,否则在队列中取走产品。
3.源代码:
class MainThread
{
public static void main(String[] args)
{
Queue queue=new Queue();
Producer producer=new Producer(queue);
Consumer consumer=new Consumer(queue);
new Thread(producer).start();
new Thread(consumer).start();
}
}
/*注意:wait notify notifyAll只能在同步方法或内步块中调用*/
class Queue
{
int product=0;
boolean bfull=false;
public synchronized void setProduct(int product)
{
if(bfull)//如果队列已满,则调用wait等待消费者取走产品
{
try
{
wait();
}
catch(Exception e)
{
e.printStackTrace();
}
}
/*开始放置产品到队列中*/
this.product=product;
System.out.println("Producer set product:"+product);
bfull=true;
notify();//生产产品后通知消费者取走产品
}
public synchronized void getProduct()
{
if(!bfull)//如果队列是空的,则调用wait等待生产者生产产品
{
try
{
wait();
}
catch(Exception e)
{
e.printStackTrace();
}
}
/*开始从队列取走产品*/
System.out.println("Consumer get product:"+product);
bfull=false;
notify();//取走产品后通知生产者继续生产产品
}
}
class Producer implements Runnable
{
Queue queue;
Producer(Queue queue)
{
this.queue=queue;
}
public void run()//生产线程
{
for(int i=1;i<=10;i++)
{
queue.setProduct(i);
}
}
}
class Consumer implements Runnable
{
Queue queue;
Consumer(Queue queue)
{
this.queue=queue;
}
public void run()//消费线程
{
for(int i=1;i<=10;i++)
{
queue.getProduct();
}
}
}
输出结果如下:
Producer set product:1
Consumer get product:1
Producer set product:2
Consumer get product:2
Producer set product:3
Consumer get product:3
Producer set product:4
Consumer get product:4
Producer set product:5
Consumer get product:5
Producer set product:6
Consumer get product:6
Producer set product:7
Consumer get product:7
Producer set product:8
Consumer get product:8
Producer set product:9
Consumer get product:9
Producer set product:10
Consumer get product:10