自动更新管控端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

82 lines
1.4 KiB

package collections
import (
"sync"
)
type BlockingQueue struct {
q *Queue
cond *sync.Cond
}
func NewBlockingQueue() *BlockingQueue {
bq := &BlockingQueue{}
bq.q = NewQueue()
bq.cond = sync.NewCond(&bq.q.lock)
return bq
}
// 将元素插入到队列末尾
func (bq *BlockingQueue) Offer(value interface{}) {
bq.cond.L.Lock()
defer bq.cond.L.Unlock()
element := &node{value: value}
if bq.q.size == 0 {
bq.q.first = element
bq.q.last = element
} else {
bq.q.last.next = element
bq.q.last = element
}
bq.q.size++
bq.cond.Signal()
}
//获取队首元素,若成功,则返回队首元素;否则返回null
func (bq *BlockingQueue) Peek() (interface{}, bool) {
return bq.q.Peek()
}
//移除并获取队首元素,若成功,则返回队首元素;否则返回null
func (bq *BlockingQueue) Poll() (interface{}, bool) {
return bq.q.Poll()
}
func (bq *BlockingQueue) Size() int {
return bq.q.Size()
}
func (bq *BlockingQueue) Clear() {
bq.q.Clear()
}
// 移除并返回队列头部的元素, 如果队列为空,则阻塞
func (bq *BlockingQueue) Take() interface{} {
bq.cond.L.Lock()
defer bq.cond.L.Unlock()
for {
if bq.q.size == 0 {
bq.cond.Wait() // 此处唤醒
} else {
break
}
}
if bq.q.size == 1 {
val := bq.q.first.value
bq.q.first = nil
bq.q.last = nil
bq.q.size = 0
return val
}
element := bq.q.first
bq.q.first = bq.q.first.next
val := element.value
element = nil
bq.q.size--
return val
}