9. 阻塞佇列
阿新 • • 發佈:2020-08-07
BlockingQueue
- 使用場景:多併發處理,執行緒池
阻塞佇列的使用
四組API
方式 | 丟擲異常 | 有返回值,不拋異常 | 阻塞等待 | 超時等待 |
---|---|---|---|---|
新增 | add | offer | put | offer( , , ) |
刪除 | remove | poll | take | poll( , ) |
檢測佇列首部 | element | peek |
程式碼測試
package pers.vincent.matrix.subject.bq; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.TimeUnit; /** * 阻塞佇列 */ public class BlockingQueueTest { public static void main(String[] args) throws InterruptedException { test4(); } /** * add / remove 丟擲異常 * 檢測佇列首部: element */ public static void test1(){ ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue(4); blockingQueue.add("a"); blockingQueue.add("b"); blockingQueue.add("c"); blockingQueue.add("d"); System.out.println("==================================="); System.out.println(blockingQueue.element()); System.out.println(blockingQueue.remove()); System.out.println(blockingQueue.remove()); System.out.println(blockingQueue.remove()); System.out.println(blockingQueue.remove()); } /** * offer / poll 不拋異常 * peek 檢索佇列首部 */ public static void test2(){ ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue(4); blockingQueue.offer("a"); blockingQueue.offer("b"); blockingQueue.offer("c"); blockingQueue.offer("d"); System.out.println("==================================="); System.out.println(blockingQueue.peek()); System.out.println(blockingQueue.poll()); System.out.println(blockingQueue.poll()); System.out.println(blockingQueue.poll()); System.out.println(blockingQueue.poll()); System.out.println(blockingQueue.poll()); } /** * put / take 阻塞 * * @throws InterruptedException */ public static void test3() throws InterruptedException { ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue(4); blockingQueue.put("a"); blockingQueue.put("b"); blockingQueue.put("c"); System.out.println("==================================="); System.out.println(blockingQueue.take()); System.out.println(blockingQueue.take()); System.out.println(blockingQueue.take()); } public static void test4() throws InterruptedException { ArrayBlockingQueue blockingQueue = new ArrayBlockingQueue(3); blockingQueue.offer("a", 2, TimeUnit.SECONDS); blockingQueue.offer("b", 2, TimeUnit.SECONDS); blockingQueue.offer("c", 2, TimeUnit.SECONDS); System.out.println("==================================="); System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS)); System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS)); System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS)); System.out.println(blockingQueue.poll(2, TimeUnit.SECONDS)); } }
SynchronousQueue 同步佇列
SynchronousQueue 不儲存元素,只要往裡面put了就必須得take之後才能再put值進去