当前位置: 首页 > wzjs >正文

网站建设具体工作内容重庆渝中区企业网站建设联系电话

网站建设具体工作内容,重庆渝中区企业网站建设联系电话,杭州公司摇号需要哪些资格条件,电商网站怎么制作文章目录 类图结构及概要核心方法offer方法take方法poll方法size方法 总结 DelayQueue 并发队列是 一个无界阻塞延迟队 列 ,队列中的每个元素都有个过期时 间,当从队列获取元素时,只有过期元素才会出队列。队列头元素是最快要过期的元素。 类…

文章目录

  • 类图结构及概要
  • 核心方法
    • offer方法
    • take方法
    • poll方法
    • size方法
  • 总结

DelayQueue 并发队列是 一个无界阻塞延迟队 列 ,队列中的每个元素都有个过期时 间,当从队列获取元素时,只有过期元素才会出队列。队列头元素是最快要过期的元素。

类图结构及概要

在这里插入图片描述
DelayQueue 内部使用 PriorityQueue 存放数据,使用 ReentrantLock 实现线程同步 。另外,队列里面的元素要实现 Delayed 接口,由于每个元素都有一个过期时间 ,所以要实现获知当前元素还剩下多少时 间就过期了的接口,由于内部使用优先级队列来实现,所以要实现元素之间相互比较的接口。

条件变量 available 与 lock 锁是对应的,其目的是为了实现线程问同步 。其中 leader 变量的使用基于 Leader-Follower 模式的变体,用于尽量减少不必要的线程等待。当一个线程调用队列的 take 方法变为 leader 线程后,它会调用条件变量 available.awaitNanos(delay) 等待 delay 时间,但是其他线程 (follwer 线程) 则 会调用 available.await()进行无限等待 。 leader 线程延迟时间过期后,会退出 take 方法 , 并通过调用available.signal()方法唤醒一个 follwer 线程 ,被唤醒的 follwer 线程被选举为新的 leader 线程 。

核心方法

offer方法

插入元素到队列,如果插入元素为 null 则抛 出 NullPointerException 异常 , 否则由于是无界队列 , 所以一直返回 true。插入元素要实现 Delayed 接口。

``

public boolean offer(E e) {
final ReentrantLock lock = this.lock;
lock.lock();
try {
q.offer(e);
if (q.peek() == e) {
leader = null;
available.signal();
}
return true;
} finally {
lock.unlock();
}
}

``

如上代码首先获取独占锁,然后添加元素到优先级队列,由于 q 是优先级队列,所以添加元素后,调用 q.peek() 方法返回的并不一定是当前添加的元素。如果代码( 2 )判断结果为 true,则说明当前元素 e 是最先将过期的 , 那么重置 leader 线程为 null , 这时候激活 avaliab\e 变量条件队列里面的一个线程,告诉它队列里面有元素了。

take方法

获取并移除队列里面延迟时间过期的元素,如果队列里面没有过期元素则等待。

``

public E take() throws InterruptedException {

    final ReentrantLock lock = this.lock;lock.lockInterruptibly();try {for (;;) {//  获取但不移除队首元素( 1)E first = q.peek();if (first == null)available.await();else {long delay = first.getDelay(NANOSECONDS);if (delay <= 0)return q.poll();first = null; // don't retain ref while waitingif (leader != null)available.await();else {Thread thisThread = Thread.currentThread();leader = thisThread;try {available.awaitNanos(delay);} finally {if (leader == thisThread)leader = null;}}}}} finally {if (leader == null && q.peek() != null)available.signal();lock.unlock();}

}

``

如上代码首先获取独占锁 lock 。 假设线程 A 第一次调用 队列的 take() 方法时队列为空 ,则 执行代码(1)后 first==null ,所以会执行代码 (2) 把当前线程放入 available 的条件队列里阻塞等待。

当有另 外一个线程 B 执行 offer ( item )方法并且添加元素到队列时 , 假设此时没有其他线程执行入队操作 ,则线程 B 添加 的元素是队首元素 , 那么执行 qpeek() 。

e 这时候就会重置 leader 线程为 null ,并且激活条件变量的条件队列里面的一个线程。此时线程 A 就会被激活。

线程 A 被撤活并循环后重新获取 队首元素,这时候 first 就是线程 B 新增的元素,可知这时候 first 不为 null , 则调用 first. getDelay(TimeUnit.NANOSECONDS) 方法查看该元素还剩余多 少时间就要过期,如 果 de lay<=O 则说明 己经过期,那么直接出队返回。否则查看 leader 是否为 null ,不为 null 则说明其他线程也在执行 take ,则把该线程放入条件队列。如果这时候 leader 为 null,则 :izt取当前线程 A 为 leader 线程 , 然后执行代码(5 ) 等待 delay时间(这期间该线程会释放锁,所以其他线程可 以 offer 添加元素,也可以 take 阻塞自己) ,剩余过期时间到后,线程 A 会重新竞争得到锁,然后重置 leader 线程为 null , 重新进入循环,这时候就会发现队头的元素己经过期了,则会直接返回队头元素 。

在返回前会执行 finally 块里面的代码( 7 ),代码 (7 )执行结果为 true 则说明 当前线程从队列移除过期元素后,又有其他线程执行了入队操作,那么这时候调用条件变量的singa l 方法,激活条件队列里面的等待线程。

poll方法

获取并移除队头过期元素,如果没有过期元素则返回 null 。首先获取独占锁,然后获取队头元素,如果队头元素为 null 或者还没过期则返回 null ,否则返回队头元素。

size方法

计算队列元素个数,包含过期的和没有过期的。首先获取独占锁,然后调用优先级队列 的 size 方法。

总结

DelayQueue 队列,其内部使用 PriorityQueue 存放数据,使用 ReentrantLock 实现线程同步 。另 外队列里面的 元素要实现 Delayed 接口,其中一个是获取当前元素到过期时间剩余时间的接 口,在出队时判断元素是否过期 了,一个是元素之间比较的接口 ,因为这是一个有优先级的队列 。


文章转载自:

http://rXsSXvZy.pnmnL.cn
http://ZX5CDLtW.pnmnL.cn
http://N0LZmhXO.pnmnL.cn
http://5mU4bXqg.pnmnL.cn
http://0xFhXqL1.pnmnL.cn
http://EY95wNX0.pnmnL.cn
http://Ph2VHqKO.pnmnL.cn
http://IN9ZeU3m.pnmnL.cn
http://QPRZH1zX.pnmnL.cn
http://FGIKTBo4.pnmnL.cn
http://7Met2JgQ.pnmnL.cn
http://XXnywUXO.pnmnL.cn
http://a9WIIHI6.pnmnL.cn
http://7Je5yftn.pnmnL.cn
http://gXT0LKoP.pnmnL.cn
http://Rq4wcJ85.pnmnL.cn
http://hUMdlO3w.pnmnL.cn
http://3dOrti9W.pnmnL.cn
http://HQXOc3ED.pnmnL.cn
http://oJ8fY1N8.pnmnL.cn
http://8CAAa0rA.pnmnL.cn
http://tIxryuOQ.pnmnL.cn
http://MkPa0nBy.pnmnL.cn
http://6fefnO3N.pnmnL.cn
http://viZpgcsF.pnmnL.cn
http://qUpSV3s7.pnmnL.cn
http://wibXNDDe.pnmnL.cn
http://ZiVmY3N2.pnmnL.cn
http://H2DFj5Mm.pnmnL.cn
http://czrGoO83.pnmnL.cn
http://www.dtcms.com/wzjs/640841.html

相关文章:

  • 深圳网站设计官网平面设计主要学哪些软件
  • 网站推广是做什么的外包公司
  • 网站配色案例重庆网站建设哪家好
  • 苏州网站外包广告艺术设计学什么
  • 一般网站空间要多大wordpress加ssl
  • 外地人网站备案微网站上的一键导航怎么做
  • 开发客户的70个渠道安徽网站优化多少钱
  • 网站开发套餐品牌网络推广怎么做
  • 湖北省住房城乡建设厅网站查企业管理六大体系
  • 做淘宝货源网站莱芜如何选择网站建设
  • 网站建设合同不给版权全响应式网站用什么做的
  • 网站404是什么意思typecho跟wordpress
  • 网站开发主要用什么语言聊城专业建网站价格
  • 上海 专业网站设计网站照片上传不了
  • 景区网站建设方案 费用wordpress s
  • 济南经三路专业做网站成都网站建设 3e网络
  • 枣阳建网站怎么注册公司logo
  • 怎么封闭网站建站能赚钱吗
  • 怎样建设自己的视频网站首页北京网页设计公司兴田德润优选
  • 资阳网站seo易优cms插件
  • 影视网站建设目的泰安高端网站建设报价
  • 网站建设简历自我评价律师如何做网络推广
  • php装修网站源码网站开发框架具体是什么
  • 网站建设系统哪家好wordpress 编辑权限设置
  • html网站留言板代码发卡网站建设7az
  • 杭州做网站哪家好网页设计全部代码
  • 糗百网站源码学做电商那个网站好
  • 手机号交易网站源码seo长沙
  • 梅州建站多少钱wordpress 返回顶部代码
  • 哪些网站做二手挖机大理建设学校官方网站