ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Java并发编程-10-保护性暂挂模式在BlockingQueue源码中

2022-01-20 17:34:32  阅读:140  来源: 互联网

标签:10 Java 队列 元素 put 源码 线程 缓冲区 方法


保护性暂挂模式在BlockingQueue源码中

说明:儒猿技术窝Java并发编程学习笔记

1、案例分析

我们开发这样一个服务器,它可以处理来自多个客户端的请求(即request)。为了不丢失客户端的请求,它要维护一个缓冲区,客户的请求会先储存到缓冲区,而服务器会从缓冲区中取出请求并执行,如果缓冲区没有请求,则服务器就等待,直到接收到通知有新的请求存入缓冲区

2、源码分析

使用一个基于数组的阻塞队列ArrayBlockingQueue作为缓冲区,如果缓冲区中isEmpty()没有请求,则线程进入等待状态,直到缓冲区非空时被signalAll()唤醒

ArrayBlockingQueue的父接口BlockingQueue接口位于JDK的java.util.concurrent包中,是线程安全的

3、非阻塞式方法

1.插入方法offer():当队列元素个数与数组长度相等时,无法添加元素;如果队列已满,返回false;如果队列没有满直接添加

2.入队操作enqueue()
获取当前数组
通过putIndex索引对数组进行赋值
索引自增,如果已经是最后一个位置,重新设置putIndex=0
唤醒调用take()方法的线程,执行元素获取操作

4、阻塞式方法

1.put方法是一个阻塞方法,如果队列元素已满,那么当前线程将会被notFull condition条件对象挂起并添加到等待队列中,直到队列又重新满足notFull未满条件,即有队列元素出队了时,才会被唤醒,继续执行put添加操作。继续执行put操作。但如果队列元素本身就没有满,那么就直接调用入队enqueue(e)方法将元素加入到数组队列中

2.添加线程的执行存在一下两种情况:
队列已满:那么新到来的执行put操作的线程将被添加到notFull的条件队列中等待
队列未满:当有线程执行了移除队列元素操作,移除成功同时唤醒put线程

3.take方法执行时,队列中有元素就删除,队列为空就阻塞等待,并且时加入notEmpty条件队列等待
如果有新得线程通过put方法添加数据时,那么同时也会唤醒talke线程,即在入队方法中唤醒notEmpty condition条件等待队列中得线程移除元素操作
如果有新得线程通过take方法移除数据时,在出队方法中唤醒notFull condition条件队列中得线程,去执行插入操作

标签:10,Java,队列,元素,put,源码,线程,缓冲区,方法
来源: https://blog.csdn.net/zhangruibo_code/article/details/122579363

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有