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);
}
}