天天看點

Java阻塞隊列poll_Java高并發,阻塞隊列BlockingQueue

BlockingQueue簡介

BlockingQueue:不是新的東西,父接口java.util.Queue

當隊列為空時,從隊列中擷取元素将阻塞。

當隊列為滿時,從隊列中添加元素将阻塞。

因為是隊列,是以我們理應想到先進先出。

Java阻塞隊列poll_Java高并發,阻塞隊列BlockingQueue
Java阻塞隊列poll_Java高并發,阻塞隊列BlockingQueue

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總結為三組:分别是插入、移除、檢查

Java阻塞隊列poll_Java高并發,阻塞隊列BlockingQueue

抛出異常組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