这种设计模式主要的使用场景是JAVA并发中,一个使用阻塞队列实现的Demo(使用链表实现的有界阻塞队列)如下:
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class ConsumerAndProducer
{
public static void main(String[] args)
{
//规定一个缓冲区
BlockingQueue<Integer> buffer = new LinkedBlockingQueue<>();
//二者使用同一个缓冲区进行数据的交换
new Thread(new Producer(buffer)).start();
new Thread(new Consumer(buffer)).start();
}
}
//生产者类,负责生产数据
class Producer implements Runnable
{
public BlockingQueue<Integer> buffer;
public Producer(BlockingQueue<Integer> buffer)
{
this.buffer = buffer;
}
@Override
public void run()
{
for(int i = 1;i<11;i++)
{
try
{
System.out.println("Producer + :" + i);
buffer.put(i);
} catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}
//消费者类,负责消费数据
class Consumer implements Runnable
{
public BlockingQueue<Integer> buffer;
public Consumer(BlockingQueue<Integer> buffer)
{
this.buffer = buffer;
}
@Override
public void run()
{
for(int i = 1;i < 11 ; i++)
{
try{
System.out.println("Consumer - :" + buffer.take());
}catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
关于生产者与消费者模式的几个使用场景:
- 使用线程池来实现生产者与消费者模式:例如,创建N个不同规模的线程池来处理不同性质的任务,比如线程池1负责将数据读到内存之后,交给线程池2里的线程继续处理压缩数据。线程池1主要处理IO密集型任务,线程池2主要处理CPU密集型任务。
- 上传附件并处理,用户把文件上传到系统后,系统把文件丢到队列里,然后立刻返回告诉用户上传成功,最后消费者再去队列里取出文件去处理等等。
生产者与消费者模式的好处:
- 简化开发,独立编写生产者和消费者,仅仅需要知道共享对象是谁。
- 生产者与消费者可以以不同的速度运行。
- 解耦合。
关于阻塞队列,请看这里。