BlockingQueue(阻塞队列)
先看继承结构:
从图中看出BlockingQueue属于集合;
主要使用场景:多线程并发处理,线程池
使用:4组api
方法 | 抛异常 | 不抛出异常,有返回值 | 阻塞 | 超时 |
---|---|---|---|---|
插入方法 | add(o) | offer(o) | put(o) | offer(o, timeout, timeunit) |
移除方法 | remove() | poll() | take() | poll(timeout, timeunit) |
检查方法 | element() | peek() |
测试1.:add(o) remove(o) element()
1. add(o) 当增加超过队列数量报出异常
public class BlockingQueueDemo {
public static void main(String[] args) {
//队列长度
ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
blockingQueue.add(1);
blockingQueue.add(1);
blockingQueue.add(1);
blockingQueue.add(1);
}
}
1.2 remove() 当队列为空时去取报出异常
public class BlockingQueueDemo {
public static void main(String[] args) {
//队列长度
ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
blockingQueue.remove();
}
}
1.3 element() 当队列为空时去检查报出异常
public class BlockingQueueDemo {
public static void main(String[] args) {
//队列长度
ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
Object element = blockingQueue.element();
System.out.println(element);
}
}
测试2:offer(o) poll() peek()
2.1 offer() 当队列增加超出队列长度时返回false,poll()取完时返回null,,peek()首元素为空时返回null
public class BlockingQueueDemo {
public static void main(String[] args) {
//队列长度
ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
System.out.println(blockingQueue.offer(1));
System.out.println(blockingQueue.offer(1));
System.out.println(blockingQueue.offer(1));
System.out.println(blockingQueue.offer(1));
//取值
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll());
//检擦首元素
System.out.println(blockingQueue.peek());
}
}
测试3:put(o) 当队列增加超出队列长度时会一只阻塞, take()
3.1 put(o)
public class BlockingQueueDemo {
public static void main(String[] args) throws InterruptedException {
//队列长度
ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
blockingQueue.put(1);
blockingQueue.put(1);
blockingQueue.put(1);
blockingQueue.put(1);
}
}
3.2 take()
public class BlockingQueueDemo {
public static void main(String[] args) throws InterruptedException {
//队列长度
ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
blockingQueue.put(1);
blockingQueue.put(1);
blockingQueue.put(1);
System.out.println(blockingQueue.take());
System.out.println(blockingQueue.take());
System.out.println(blockingQueue.take());
System.out.println(blockingQueue.take());
}
}
offer(o, timeout, timeunit),poll(timeout, timeunit)
类似第三组 唯一区别就是可以设置等待时间,如果超时则退出