BlockingQueue簡介
BlockingQueue:不是新的東西,父接口java.util.Queue
當隊列為空時,從隊列中擷取元素将阻塞。
當隊列為滿時,從隊列中添加元素将阻塞。
因為是隊列,是以我們理應想到先進先出。
BlockingQueue常用API
boolean
将指定的元素插入到此隊列中,如果可以立即執行此操作而不違反容量限制, true在成功後傳回 IllegalStateException如果目前沒有可用空間,則抛出IllegalStateException。
boolean
如果此隊列包含指定的元素,則傳回 true 。
int
從該隊列中删除所有可用的元素,并将它們添加到給定的集合中。
int
drainTo(Collection super E> c, int maxElements)
最多從該隊列中删除給定數量的可用元素,并将它們添加到給定的集合中。
boolean
将指定的元素插入到此隊列中,如果可以立即執行此操作,而不會違反容量限制, true在成功時 false如果目前沒有可用空間,則傳回false。
boolean
offer(E e, long timeout, TimeUnit unit)
将指定的元素插入到此隊列中,等待指定的等待時間(如有必要)才能使空間變得可用。
poll(long timeout, TimeUnit unit)
檢索并删除此隊列的頭,等待指定的等待時間(如有必要)使元素變為可用。
void
将指定的元素插入到此隊列中,等待空格可用。
int
傳回該隊列最好可以(在沒有存儲器或資源限制)接受而不會阻塞,或附加的元素的數量 Integer.MAX_VALUE如果沒有固有的限制。
boolean
從該隊列中删除指定元素的單個執行個體(如果存在)。
檢索并删除此隊列的頭,如有必要,等待元素可用。
将上述API總結為三組:分别是插入、移除、檢查
抛出異常組API
add(抛出異常):
public classBlockingQueueDemo {public static voidmain(String[] args) {
BlockingQueue blockingQueue=new ArrayBlockingQueue<>(3);
System.out.println(blockingQueue.add("a"));
System.out.println(blockingQueue.add("b"));
System.out.println(blockingQueue.add("c"));
System.out.println(blockingQueue.add("x"));
}
}
結果如下:
true
true
trueException in thread"main"java.lang.IllegalStateException: Queue full
at java.util.AbstractQueue.add(AbstractQueue.java:98)
at java.util.concurrent.ArrayBlockingQueue.add(ArrayBlockingQueue.java:312)
at juc.BlockingQueueDemo.main(BlockingQueueDemo.java:16)
remove(抛出異常):
public classBlockingQueueDemo {public static voidmain(String[] args) {
BlockingQueue blockingQueue=new ArrayBlockingQueue<>(3);
System.out.println(blockingQueue.add("a"));
System.out.println(blockingQueue.add("b"));
System.out.println(blockingQueue.add("c"));//System.out.println(blockingQueue.add("x"));
System.out.println(blockingQueue.remove()); //傳回值是E(即對象) 因為是隊列 是以是a
System.out.println(blockingQueue.remove());
System.out.println(blockingQueue.remove());
System.out.println(blockingQueue.remove());
}
}
這裡需要注意的是remove的傳回類型是E(Entity對象)
結果如下:
true
true
truea
b
c
Exception in thread"main"java.util.NoSuchElementException
at java.util.AbstractQueue.remove(AbstractQueue.java:117)
at juc.BlockingQueueDemo.main(BlockingQueueDemo.java:20)
Process finished with exit code1
我們可以看到如果添加的元素大于3之後,即當隊列空了之後再删會抛異常:java.util.NoSuchElementException
element(抛出異常):
public classBlockingQueueDemo {public static voidmain(String[] args) {
BlockingQueue blockingQueue=new ArrayBlockingQueue<>(3);
System.out.println(blockingQueue.add("a"));
System.out.println(blockingQueue.add("b"));
System.out.println(blockingQueue.add("c"));
System.out.println(blockingQueue.element());
}
}
結果如下:
true
true
truea
作用:檢查隊首元素是什麼
特殊值組API
offer(特殊值):
public classBlockingQueueDemo {public static voidmain(String[] args) {
BlockingQueue blockingQueue=new ArrayBlockingQueue<>(3);
System.out.println(blockingQueue.offer("a"));
System.out.println(blockingQueue.offer("b"));
System.out.println(blockingQueue.offer("c"));
System.out.println(blockingQueue.offer("d"));
}
}
結果如下:
true
true
true
false
poll(特殊值):
public classBlockingQueueDemo {public static voidmain(String[] args) {
BlockingQueue blockingQueue=new ArrayBlockingQueue<>(3);
System.out.println(blockingQueue.offer("a"));
System.out.println(blockingQueue.offer("b"));
System.out.println(blockingQueue.offer("c"));
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll());
}
}
結果如下:
true
true
truea
b
cnull
peek(特殊值):
public classBlockingQueueDemo {public static voidmain(String[] args) {
BlockingQueue blockingQueue=new ArrayBlockingQueue<>(3);
System.out.println(blockingQueue.offer("a"));
System.out.println(blockingQueue.offer("b"));
System.out.println(blockingQueue.offer("c"));
System.out.println(blockingQueue.peek());
}
}
結果如下:
true
true
truea
阻塞組API
put(阻塞):
public classBlockingQueueDemo {public static void main(String[] args) throwsInterruptedException {
BlockingQueue blockingQueue=new ArrayBlockingQueue<>(3);
blockingQueue.put("a");
blockingQueue.put("b");
blockingQueue.put("c");
blockingQueue.put("d");
}
}
結果如下:
1.
就是啥都沒有一片空白,因為此時一直阻塞,等待
take(阻塞):
public classBlockingQueueDemo {public static void main(String[] args) throwsInterruptedException {
BlockingQueue blockingQueue=new ArrayBlockingQueue<>(3);
blockingQueue.put("a");
blockingQueue.put("b");
blockingQueue.put("c");
System.out.println(blockingQueue.take());
blockingQueue.put("e");
System.out.println(blockingQueue.take());
System.out.println(blockingQueue.take());
System.out.println(blockingQueue.take());
}
}
結果如下:
a
b
c
e
與上面的put對比一下,這裡abc添加進去後如果想加e是加不進去的,會阻塞,而take進行取出後就能加入e了
逾時組API
offer(逾時):
public classBlockingQueueDemo {public static void main(String[] args) throwsInterruptedException {
BlockingQueue blockingQueue=new ArrayBlockingQueue<>(3);
System.out.println(blockingQueue.offer("a"));
System.out.println(blockingQueue.offer("b"));
System.out.println(blockingQueue.offer("c"));
System.out.println(blockingQueue.offer("d", 3L, TimeUnit.SECONDS));
}
}
結果如下:
true
true
true
false //等待了3s
讓其等待3s,傳回值為boolean
poll(逾時):
public classBlockingQueueDemo {public static void main(String[] args) throwsInterruptedException {
BlockingQueue blockingQueue = new ArrayBlockingQueue<>(3);
System.out.println(blockingQueue.offer("a"));
System.out.println(blockingQueue.offer("b"));
System.out.println(blockingQueue.offer("c"));
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll(3L, TimeUnit.SECONDS));
}
}
結果如下:
true
true
truea
b
cnull //等待了3s