阻塞队列
BlockingQueue除了队列的基本特性外,还支持额外的操作:当获取元素时,如果队列已空,则阻塞直到队列非空。当添加元素时,如果队列已满,则阻塞直到队列有空闲空间。 BlockingQueue的方法有4种形式,对于不能立即被满足,但可能会在未来的某个时刻被满足的操作,它们各自有不同的处理方式: 第一种是抛出异常。 第二种是返回特殊值(null或者false,取决于操作) 第三种是一直阻塞当前线程直到操作成功 第四种是阻塞直到超时退出。 这些方法汇总如下:BlockingQueue不接受null元素。如果尝试add, put or offer 一个null元素,则会抛出NullPointerException。null被用作表明poll操作失败的警示值。
BlockingQueue可以限定容量。在任何指定时刻它都可能有一个剩余容量,但超出了这个容量,没有任何元素可以不阻塞而put进这些剩余容量中。没有容量限制的阻塞队列总是 XXXXX
ArrayBlockingQueue
ArrayBlockingQueue是一个由数组实现的有界队列。队列中的元素遵循FIFO顺序。队列的头部元素在队列中存在时间最长,尾部元素存在时间最短。新元素插入到队列尾部,获取元素的操作在队列的头部进行。 这是一个典型的”有界缓存区”,固定大小的数组保存着元素,这些元素被生产者插入,并由消费者取出。队列一旦创建,容量将不能修改。向已满的队列中插入元素时将会导致阻塞,向已空的队列中回去元素也同样会阻塞。 这个类支持对等待的消费者和生产者线程进行排序的可选的公平策略。默认情况是保证这种排序的。然而,创建队列时通过将公平性设置为true,会保证线程以FIFO的顺序访问。公平性通常会降低吞吐量,但也减少了可变性和避免了不平衡性。