-
Notifications
You must be signed in to change notification settings - Fork 784
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
2019-11-22:什么是BlockingQueue?请分析一下其内部原理并谈谈它的使用场景? #194
Comments
前言: 认识BlockingQueue 从上图我们可以很清楚看到,通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出;
下面两幅图演示了BlockingQueue的两个常见阻塞场景: 如上图所示:当队列中填满数据的情况下,生产者端的所有线程都会被自动阻塞(挂起),直到队列中有空的位置,线程被自动唤醒。 BlockingQueue成员详细介绍
ArrayBlockingQueue和LinkedBlockingQueue是两个最普通也是最常用的阻塞队列,一般情况下,在处理多线程间的生产者消费者问题,使用这两个类足以。 |
#关于BlockingQueue #ArrayBlockingQueue使用场景 分析: 使用场景: 人事系统中员工离职/变更后,其他依赖应用进行数据同步。 在一些项目中,可能同公司的其他部门的应用服务会要求同步我们人事系统的部分组织架构数据,但是当人事系统数据发生变更后,应用的依赖方需要进行数据的同步, 这种场景下,由于员工离职/变更操作不是非常频繁,所以能有效防止线程阻塞,也基本没有并发和吞吐量的要求,所以可以将数据存放到ArrayBlockingQueue中, 由依赖方应用服务进行获取同步。 #LinkedBlockingQueue使用场景 LinkedBlockingQueue基于链表实现,队列容量默认Integer.MAX_VALUE 分析: 使用场景: 订单完成的邮件/短信提醒。 订单系统中当用户下单成功后,将信息放入ArrayBlockingQueue中,由消息推送系统取出数据进行消息推送提示用户下单成功。 如果订单的成交量非常大,那么使用ArrayBlockingQueue就会有一些问题,固定数组很容易被使用完,此时调用的线程会进入阻塞,那么可能无法及时将消息推送出去,所以使用LinkedBlockingQueue比较合适,但是要注意消费速度不能太低,不然很容易内存被使用完(一般而言不会时时刻刻生产消息, 但是需要预防消息大量堆积) 比较ArrayBlockingQueue: 这里也赘述下,有人可能会问为什么不用MQ,或者Redis 笔者认为:很多技术知识有相同的使用场景,是很常见的,使用MQ/Redis也好,阻塞队列也罢,我们需要考虑项目中采用哪种方案是最合适的的,如果我们有现成的MQ/Redis,且公司前辈对于功能的使用有一个很好的封装,或者业务要求必须使用MQ,那我们项目使用这些也没有问题,但是如果没有现成的MQ/Redis或者没有现成的使用封装,业务又相对单一,那我们用阻塞队列简单的写一个小功能去实现也是很不错的,当然如果你是为了学习这些中间件那就另当别论了。 #PriorityBlockingQueue使用场景 根据传入的优先级进行排序,保证按优先级来消费 分析 使用场景: VIP排队购票(实现代码在文章末尾) 用户购票的时候,根据用户不同的等级,优先放到队伍的前面,当存在票源的时候,根据优先级分配 DelayQueue使用场景 分析: 使用场景: 订单超时取消功能 用户下订单未支付开始倒计时,超时则释放订单中的资源,如果取消或者完成支付,我们再讲队列中的数据移除掉。 网站刷题倒计时 (实现代码在文章末尾) 逻辑同上 #SynchronousQueue使用场景 分析: 使用场景: 参考线程池newCachedThreadPool()。 如果我们不确定每一个来自生产者请求数量但是需要很快的处理掉,那么配合SynchronousQueue为每个生产者请求分配一个消费线程是最简洁的办法。Executors.newCachedThreadPool()就使用了SynchronousQueue,这个线程池根据需要(新任务到来时)创建新的线程,如果有空闲线程则会重复使用,线程默认空闲了60秒后会被回收。 轻量级别的任务转交 比如会话转交,通常坐席需要进行会话转交,如果有坐席在线那么会为我们分配一个客服,但是如果没有,那么阻塞请求线程,一段时间后会超时或者提示当前坐席已满。 |
No description provided.
The text was updated successfully, but these errors were encountered: