多接口在插入数据的时候直接插入到数据库,有时候数据一多,会给我们数据库带来很大的压力,这个时候我们就需要用一个类似缓冲池给数据做一个缓冲,实现的方法有很多种。
比如:redis的list数组,Mq等中间件的消息队列,
还有我们今天要讲的BlockingQueue阻塞队列
什么是BlockingQueue?
阻塞队列首先是一个队列,当队列是空的时候,从队列获取元素的操作将会被阻塞,当队列是满的时候,从队列插入元素的操作将会被阻塞。
他有哪些方法?
这里面的意思就是插入
方法一共有四
个,其中如果队列满了之后用add
方法继续插入就会抛出异常。
这里就不具体详解每个方法吗,如果这篇文章点赞多的话,我会考虑出一期方法详解
我们怎么在实际的项目过程中去使用他?
首先我们在接口插入的时候去存到BlockingQueue
中去:
之后我们再创建一个异步线程去消费他,我们在启动的时候就初始化一个线程去消费:
这里我需要有一个config类去把ExecutorService
注入到bean里面去,因为ExecutorService是一个接口:
最后我们在消费线程里面去消费就行啦:
总结:
在多线程领域,所谓阻塞,在某些情况下会挂起线程(即阻塞),一旦条件满足,被挂起的线程又会自动被唤醒。
使用BlockingQueue好处是我们不需要关心什么时候去阻塞线程,什么时候需要唤醒线程,因为这一切BlockingQue都给你一手包办了。
在Concurrent包发布以前,在多线程环境下,我们每个程序员都要去控制这些细节,尤其还要兼顾效率与线程安全,这会给我们的程序带来不小的复杂度。