Queue
找到java.util.Queue,可以看到其继承自java.util.Collection
public interface Queue<E> extends Collection<E> {
boolean add(E e);
boolean offer(E e);
E remove();
E poll();
E element();
E peek();
}
快捷键ctrl+h查看继承结构
其中java.util.concurrent.BlockingQueue阻塞队列,在线程池的构造方法中被使用到
队列Queue的几个方法(其父接口Collection方法的使用参考ArrayList)
(Queue的API了解后,其子类使用方式都相同,拿其子类LinkedBlockingQueue举例子)
public static void main(String[] args) {
//队列就是用来放数据的集合,类似List<Integer> list = new ArrayList(); LinkedList也是一个队列
Queue<String> queue = new LinkedBlockingQueue();
//Queue的六个方法
System.out.println("add添加一个元素"+queue.add("a"));
System.out.println("offer添加一个元素"+queue.offer("b"));
System.out.println("element返回第一个元素"+queue.element());
System.out.println("peek返回第一个元素"+queue.peek());
System.out.println("poll返回第一个元素,并在队列中删除"+queue.poll());
System.out.println("remove返回第一个元素,并在队列中删除"+queue.remove());
//区别 add()和remove()element()方法在失败的时候会抛出异常
}
结果
add添加一个元素true
offer添加一个元素true
element返回第一个元素a
peek返回第一个元素a
poll返回第一个元素,并在队列中删除a
remove返回第一个元素,并在队列中删除b
异常演示
public static void main(String[] args) {
Queue<String> queue = new LinkedBlockingQueue(2);
//演示失败的情况,队列长度为2,超出时
queue.add("a");
queue.add("b");
try {
queue.add("c");
} catch (Exception e) {
System.out.println("add添加失败抛出异常" + e);
}
System.out.println("offer添加失败返回" + queue.offer("c"));
//队列为空时
queue.clear();
try {
queue.element();
} catch (Exception e) {
System.out.println("队列为空时element返回第一个元素异常" + e);
}
System.out.println("队列为空时peek返回第一个元素" + queue.peek());
try {
queue.remove();
} catch (Exception e) {
System.out.println("队列为空时remove返回第一个元素,并在队列中删除异常" + e);
}
System.out.println("队列为空时poll返回第一个元素,并在队列中删除" + queue.poll());
}
结果
add添加失败抛出异常java.lang.IllegalStateException: Queue full
offer添加失败返回false
队列为空时element返回第一个元素异常java.util.NoSuchElementException
队列为空时peek返回第一个元素null
队列为空时remove返回第一个元素,并在队列中删除异常java.util.NoSuchElementException
队列为空时poll返回第一个元素,并在队列中删除null
可以看到代码很多try catch,可以封装一个语法糖(甚至你可以自己去扩展finally块)
/**
* try catch 有点占行,封装一个语法糖
* @param function 目标方法
* @param param 参数
* @param message 异常时信息
* @param <P> 目标方法参数
* @param <R> 目标方法结果
* @return
*/
public static <P, R> R doExecute(Function<P, R> function, P param, String message) {
R result = null;
try {
result = function.apply(param);
} catch (Exception e) {
System.out.println(message + e);
}
return result;
}
改造之后的代码就清爽很多
public static void main(String[] args) {
Queue<String> queue = new LinkedBlockingQueue(2);
//演示失败的情况,队列长度为2,超出时
queue.add("a");
queue.add("b");
doExecute(parameter -> queue.add(parameter), "c","add添加失败抛出异常");
System.out.println("offer添加失败返回" + queue.offer("c"));
//队列为空时
queue.clear();
//这个参数“c”是可有可无的,不管你传什么,queue.element()并没有使用参数
doExecute(parameter -> queue.element(), "c","队列为空时element返回第一个元素异常");
System.out.println("队列为空时peek返回第一个元素" + queue.peek());
doExecute(parameter -> queue.remove(), null,"队列为空时remove返回第一个元素,并在队列中删除异常");
System.out.println("队列为空时poll返回第一个元素,并在队列中删除" + queue.poll());
}
运行结果
add添加失败抛出异常java.lang.IllegalStateException: Queue full
offer添加失败返回false
队列为空时element返回第一个元素异常java.util.NoSuchElementException
队列为空时peek返回第一个元素null
队列为空时remove返回第一个元素,并在队列中删除异常java.util.NoSuchElementException
队列为空时poll返回第一个元素,并在队列中删除null