ArrayBlockQueue的部分移除(消费)元素的方法(JDK17) 先分析一下take和poll这两个方法: take:阻塞式加锁移除元素,移除失败则一直会在notEmpty的condition上无限等待,直到被生产者唤醒或被外界打断(interrupt)。 poll:非阻塞式加锁移除元素,移除失败(发现元素个数 = 数组长度)则立刻返回null。 如果符合消费条件(即队...
打印出ArrayBlockQueue,结果是10,50,20,60。 用poll方法,弹出ArrayBlockQueue第一个元素,并且打印出来:10。 打印出ArrayBlockQueue,结果是50,20,60。 用take方法,弹出ArrayBlockQueue第一个元素,并且打印出来:50。 打印出ArrayBlockQueue,结果是20,60。 用peek方法,弹出ArrayBlockQueue第一个元素,并且打印出来:20。
peek,只是弹出元素,不会清空元素。 poll,弹出并清空元素,如果队列为空,直接返回null。 take,弹出并清空元素,如果队列为空,会被阻塞。
}// 直接将一个元素取出,然后首位元素置空 总结,从实现来看,相比ArrayBlockQueue,LinkedBlockQueue的加锁方法相对更加复杂,但是其入队和出队方法更加简单;和ArrayBlockQueue一样,take、put方法阻塞,offer、add、poll方法不会阻塞
Linked queues typically have higher throughput than array-based queues but less predictable performance in most concurrent applications. 这个主要针对LinkedBlockingQueue是无界的场景来说,由于无界,所以offer以及poll的吞吐量通常比ArrayBlockingQueue高。
final Object[] items; /** 消费者序列号 for next take, poll, peek or remove */ int takeIndex; /**生产者序列号 for next put, offer, or add */ int putIndex; /** 队列大小 */ int count; /* * 并发的控制采用两种condition的逻辑,也就是俗称的”两把锁“ ...
用poll方法,弹出ArrayBlockQueue第一个元素,并且打印出来:10。 打印出ArrayBlockQueue,结果是50,20,60。 用take方法,弹出ArrayBlockQueue第一个元素,并且打印出来:50。 打印出ArrayBlockQueue,结果是20,60。 用peek方法,弹出ArrayBlockQueue第一个元素,并且打印出来:20。
用poll方法,弹出ArrayBlockQueue第一个元素,并且打印出来:10。 打印出ArrayBlockQueue,结果是50,http://20,60。 用take方法,弹出ArrayBlockQueue第一个元素,并且打印出来:50。 打印出ArrayBlockQueue,结果是20,60。 用peek方法,弹出ArrayBlockQueue第一个元素,并且打印出来:20。
用poll方法,弹出ArrayBlockQueue第一个元素,并且打印出来:10。 打印出ArrayBlockQueue,结果是50,20,60。 用take方法,弹出ArrayBlockQueue第一个元素,并且打印出来:50。 打印出ArrayBlockQueue,结果是20,60。 用peek方法,弹出ArrayBlockQueue第一个元素,并且打印出来:20。