最近公司在开发项目中,需要通过excel批量上传将商品加入购物车,如果excel中商品过多,用户访问比较多的情况下,给服务器造成的压力极大,稍有不慎,极容易造成服务器崩溃,所以引入队列(实现生产者、消费者模式),保证服务器正常运行。
1、什么是队列Queue
简而言之:队列是一种数据结构,其特点就是先进先出,是作为生产者、消费者的首选。
2、BlockingQueue提供了以下几个方法:
add 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
offer 添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返问队列头部的元素 如果队列为空,则返回null
peek 返回队列头部的元素 如果队列为空,则返回null
put 添加一个元素 如果队列满,则阻塞
take 移除并返回队列头部的元素 如果队列为空,则阻塞
3、LinkedBlockingQueue implements BlockingQueue
LinkedBlockingQueue 是线程安全的,实现了先进先出的特性,是生产者、消费者模式的选择之一。
4、定义买家批量加入购物车生产者
public class BuyerBatchAddCartProducer implements Runnable { private static final Logger log = LoggerFactory.getLogger(BuyerBatchAddCartProducer.class); private BuyerBatchExcelProcessPo buyerBatchExcelProcessPo; public void setBuyerBatchExcelProcessPo(BuyerBatchExcelProcessPo buyerBatchExcelProcessPo) { this.buyerBatchExcelProcessPo = buyerBatchExcelProcessPo; } @Override public void run() { log.info("添加前队列的大小:" + WebExecutorServicePool.getBuyerBatchQueue().size()); boolean flag = WebExecutorServicePool.getBuyerBatchQueue().offer(buyerBatchExcelProcessPo); log.info("添加后队列的大小:" + WebExecutorServicePool.get