From fd02d2a618b0f05244f2e8d60aa706512b512221 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E6=9F=922012?= <345849402@qq.com> Date: Sun, 9 Feb 2020 16:36:31 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=E5=BE=AE=E4=BF=A1=E6=8A=A2=E7=BA=A2?= =?UTF-8?q?=E5=8C=85=E8=BF=87=E6=9C=9F=E5=A4=B1=E6=95=88=E5=AE=9E=E6=88=98?= =?UTF-8?q?=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../seckill/queue/delay/jvm/RedPacketQueue.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/java/com/itstyle/seckill/queue/delay/jvm/RedPacketQueue.java b/src/main/java/com/itstyle/seckill/queue/delay/jvm/RedPacketQueue.java index cedfb39..bd196a7 100644 --- a/src/main/java/com/itstyle/seckill/queue/delay/jvm/RedPacketQueue.java +++ b/src/main/java/com/itstyle/seckill/queue/delay/jvm/RedPacketQueue.java @@ -32,12 +32,28 @@ public class RedPacketQueue { } /** * 生产入队 + * 1、执行加锁操作 + * 2、把元素添加到优先级队列中 + * 3、查看元素是否为队首 + * 4、如果是队首的话,设置leader为空,唤醒所有等待的队列 + * 5、释放锁 */ public Boolean produce(RedPacketMessage message){ return queue.add(message); } /** * 消费出队 + * 1、执行加锁操作 + * 2、取出优先级队列元素q的队首 + * 3、如果元素q的队首/队列为空,阻塞请求 + * 4、如果元素q的队首(first)不为空,获得这个元素的delay时间值 + * 5、如果first的延迟delay时间值为0的话,说明该元素已经到了可以使用的时间,调用poll方法弹出该元素,跳出方法 + * 6、如果first的延迟delay时间值不为0的话,释放元素first的引用,避免内存泄露 + * 7、判断leader元素是否为空,不为空的话阻塞当前线程 + * 8、如果leader元素为空的话,把当前线程赋值给leader元素,然后阻塞delay的时间,即等待队首到达可以出队的时间,在finally块中释放leader元素的引用 + * 9、循环执行从1~8的步骤 + * 10、如果leader为空并且优先级队列不为空的情况下(判断还有没有其他后续节点),调用signal通知其他的线程 + * 11、执行解锁操作 */ public RedPacketMessage consume() throws InterruptedException { return queue.take();