本文已参与「新人创作礼」活动, 一起开启掘金创作之路。
BockingQueue的核心方法
它是一个队列,支持阻塞机制,阻塞的放入和得到数据。
常用方法:
Offer(anObject):表示如果有可能,将anObject加到队列中,如果可以容纳,则返回true,否则返回false,(本方法不阻塞当前执行线程的方法)。
Put(anObject):把anObject添加到队列中,如果队列没有空间,调用方法的线程被阻塞,直到队列有空间再加入。
Poll(time):取走队列中排在首位的对象,若取不出,可以等time规定的时间,取不到时返回null.
Take():取走队列中排在首位的对象,如果队列为空,调用方法的线程被阻塞,直到队列有新元素在取出。
DrainTo():一次从队列中取出所有元素,可以提升效率,不用分配取元素。
模拟linkedBlockingQueue的put和take方法
Put:把object添加到BlockingQueue里,如果BlockingQueue没有空间,则调用此方法的线程被阻断,直到BlockingQueue里面有空间在继续。
Take:取走BlockingQueue里排在首位的对象,若BolckingQueue为空,阻断进入阻塞状态,直到BlockingQueue加入新的元素。
抛出异常
当阻塞队列满时,再往队列里add插入元素会抛llegalStateException: Queue full
当阻塞队列空时,再往队列里remove 移除元素会抛NoSuchElementException
特殊值
插入方法,成功ture失败false
移除方法,成功返回出队列的元素,队列里面没有就返回null
一直阻塞
当阻塞队列满时,生产者线程继续往队列里put元素,队列会一直阻塞生产线程直到put数据or响应中断退出。
当阻塞队列空时,消费者线程试图从队列里take元素,队列会一直阻塞消费者线程直到队列可用。 超时退出
当阻塞队列满时,队列会阻塞生产者线程- -定时间,超过后限时后生产者线程会退出
异常用法
element()是检查队头元素是谁
package com.wsx.blockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class BlockingQueueDemo {
public static void main(String[] args) {
BlockingQueue<Object> queue = new ArrayBlockingQueue<>(3);
System.out.println(queue.add("1"));
System.out.println(queue.add("2"));
System.out.println(queue.add("3"));
//System.out.println(queue.add("6"));
System.out.println(queue.element());
System.out.println(queue.remove());
System.out.println(queue.remove());
System.out.println(queue.remove());
//System.out.println(queue.remove());
}
}
特殊值用法(也就是布尔值)
peek()是查看队列顶端元素
offer添加超过队长返回false
pull拿值无值返回null
package com.wsx.blockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;
public class BlockingQueueDemo2 {
public static void main(String[] args) {
BlockingQueue<Object> queue = new ArrayBlockingQueue<>(3);
try {
System.out.println(queue.offer(1,1, TimeUnit.SECONDS));
System.out.println(queue.offer(2,1, TimeUnit.SECONDS));
System.out.println(queue.offer(3,1, TimeUnit.SECONDS));
System.out.println(queue.offer(4,1, TimeUnit.SECONDS));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println();
System.out.println(queue.peek());
System.out.println();
try {
System.out.println(queue.poll(1,TimeUnit.SECONDS));
System.out.println(queue.poll(1,TimeUnit.SECONDS));
System.out.println(queue.poll(1,TimeUnit.SECONDS));
System.out.println(queue.poll(1,TimeUnit.SECONDS));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}