阻塞队列
package com.collection; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.TimeUnit; /** * 用”等待队列“模拟唐僧师徒过通天河。 */ public class TestBlockingQueue2 { static int CAPACITY = 3; static String[] westGroup = {"唐僧", "猪悟能", "沙悟净", "孙悟空"}; public static void main(String[] args) throws Exception { test4(); } /** * 第一组API:抛出异常 */ public static void test1() { // 创建一只千年老龟容量3. BlockingQueue<String> 千年老龟 = new ArrayBlockingQueue<String>(CAPACITY); // 准备过河:唐僧,猪悟能,沙悟净 先上 for (int i = 0; i < 3; i++) { boolean bool = 千年老龟.add(westGroup[i]); if (bool) { System.out.println(westGroup[i] + "上船成功!"); } } // 满了再添加就报异常:java.lang.IllegalStateException: Queue full boolean bool = 千年老龟.add("孙悟空"); if (bool) { System.out.println("孙悟空上船成功!"); } else { System.out.println("孙悟空上船失败!"); } System.out.println("船头第一人是:" + 千年老龟.element()); System.out.println("船上一共有:" + 千年老龟.size()); // 过完河都“下船” for (int i = 0; i < CAPACITY; i++) { String p = 千年老龟.remove(); System.out.println("下船:" + p); } // 都“下船”了,再remove(),也会异常。 // 千年老龟.remove(); // java.util.NoSuchElementException } /** * 第2组API:返回true或false */ public static void test2() { // 创建一只千年老龟容量3. BlockingQueue<String> 千年老龟 = new ArrayBlockingQueue<String>(CAPACITY); // 准备过河:唐僧,猪悟能,沙悟净 先上 for (int i = 0; i < 3; i++) { boolean bool = 千年老龟.offer(westGroup[i]); if (bool) { System.out.println(westGroup[i] + "上船成功!"); } } // 满了再添加也不抛异常: boolean bool = 千年老龟.offer("孙悟空"); if (bool) { System.out.println("孙悟空上船成功!"); } else { System.out.println("孙悟空上船失败!"); } System.out.println("船头第一人是:" + 千年老龟.peek()); System.out.println("船上一共有:" + 千年老龟.size()); // 过完河都“下船” for (int i = 0; i < CAPACITY; i++) { String p = 千年老龟.poll(); System.out.println("下船:" + p); } // 都“下船”了,再poll(),也不抛异常 千年老龟.poll(); } /** * 第3组API:常存抱柱信 * * @throws Exception */ public static void test3() throws Exception { // 创建一只千年老龟容量3. BlockingQueue<String> 千年老龟 = new ArrayBlockingQueue<String>(CAPACITY); // 准备过河:唐僧,猪悟能,沙悟净 先上 for (int i = 0; i < 3; i++) { 千年老龟.put(westGroup[i]); // 无返回值。 System.out.println(westGroup[i] + "上船成功!"); } // 满了再添加:会一直阻塞。 new Thread(){ public void run(){ //下船 try { Thread.sleep(5000); String p = 千年老龟.take(); System.out.println("线程中下船:" + p); } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); System.out.println("孙悟空上船。。"); 千年老龟.put("孙悟空"); //如果调用put方法,队列满了,会一直等待,除非队列中取出了数据 System.out.println("船头第一人是:" + 千年老龟.peek()); System.out.println("船上一共有:" + 千年老龟.size()); // 过完河都“下船” for (int i = 0; i < CAPACITY; i++) { String p = 千年老龟.take(); System.out.println("下船:" + p); } // 都“下船”了,再take(),也会一直阻塞。 // 千年老龟.take(); } /** * 第4组API:限时等待。 * * @throws Exception */ public static void test4() throws Exception { // 创建一只千年老龟容量3. BlockingQueue<String> 千年老龟 = new ArrayBlockingQueue<String>(CAPACITY); // 准备过河:唐僧,猪悟能,沙悟净 先上 for (int i = 0; i < 3; i++) { 千年老龟.offer(westGroup[i]); // 无返回值。 System.out.println(westGroup[i] + "上船成功!"); } // 满了再添加:再等待3秒钟,就退出 boolean flag = 千年老龟.offer("孙悟空", 10, TimeUnit.SECONDS); System.out.println("孙悟空上船的结果为:"+flag); System.out.println("船头第一人是:" + 千年老龟.peek()); System.out.println("船上一共有:" + 千年老龟.size()); // 过完河都“下船” for (int i = 0; i < CAPACITY; i++) { String p = 千年老龟.take(); System.out.println("下船:" + p); } // 都“下船”了,再poll(),等待3秒,就退出 千年老龟.poll(3, TimeUnit.SECONDS); } }