队列:FIFO 写入:如果队列满了,就必须阻塞等待 取:如果队列是空的,就必须阻塞等待生产
四组API
- 抛出异常
- 不会抛出异常,有返回值
- 阻塞等待
- 超时等待
方式 | 抛出异常 | 不会抛出异常,有返回值 | 阻塞等待 | 超时等待 |
---|---|---|---|---|
添加 | add() | offer () | put() | offer(时间,单位) |
移除 | remove() | poll() | take() | poll(时间,单位) |
检测队列首 | element() | peek() |
ArrayBlockingQueue
使用场景:多线程并发处理;线程池
/**
* 抛出异常
*/
public static void test1(){
//给定队列大小
ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(3);
System.out.println(arrayBlockingQueue.add("a"));
System.out.println(arrayBlockingQueue.add("b"));
System.out.println(arrayBlockingQueue.add("c"));
//检测对首元素
System.out.println(arrayBlockingQueue.element());
//设置队列大小为3,添加第四个时会抛出异常java.lang.IllegalStateException: Queue full
//System.out.println(arrayBlockingQueue.add("d"));
System.out.println(arrayBlockingQueue.remove()); //由于队列先进先出特性,抛出也是抛出先添加进队列的元素,并且会返回抛出的元素
System.out.println(arrayBlockingQueue.remove());
System.out.println(arrayBlockingQueue.remove());
//队列中最多可以存三个,所以移除也最多只能移除三个,当移除第四个时,会抛出java.util.NoSuchElementException
//System.out.println(arrayBlockingQueue.remove());
}
/**
* 有返回值,没有异常
*/
public static void test2(){
//给定队列大小
ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(3);
System.out.println(arrayBlockingQueue.offer("a"));
System.out.println(arrayBlockingQueue.offer("b"));
System.out.println(arrayBlockingQueue.offer("c"));
//检测对首元素
System.out.println(arrayBlockingQueue.peek());
//设置队列大小为3,添加第四个时会返回false,不抛出异常
//System.out.println(arrayBlockingQueue.offer("d"));
System.out.println(arrayBlockingQueue.poll()); //由于队列先进先出特性,抛出也是抛出先添加进队列的元素,并且会返回抛出的元素
System.out.println(arrayBlockingQueue.poll());
System.out.println(arrayBlockingQueue.poll());
//队列中最多可以存三个,所以移除也最多只能移除三个,当移除第四个时,返回null
System.out.println(arrayBlockingQueue.poll());
}
/**
* 等待 阻塞(一直阻塞)
*/
public static void test3() throws InterruptedException {
//给定队列大小
ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(3);
arrayBlockingQueue.put("a");
arrayBlockingQueue.put("b");
arrayBlockingQueue.put("c");
//设置队列大小为3,添加第四个时会一直等待
arrayBlockingQueue.put("d");
System.out.println(arrayBlockingQueue.take()); //由于队列先进先出特性,抛出也是抛出先添加进队列的元素,并且会返回抛出的元素
System.out.println(arrayBlockingQueue.take());
System.out.println(arrayBlockingQueue.take());
//队列中最多可以存三个,所以移除也最多只能移除三个,当移除第四个时,会一直等待
System.out.println(arrayBlockingQueue.take());
}
/**
* 等待 阻塞(等待超时)
*/
public static void test4() throws InterruptedException {
//给定队列大小
ArrayBlockingQueue arrayBlockingQueue = new ArrayBlockingQueue<>(3);
System.out.println(arrayBlockingQueue.offer("a"));
System.out.println(arrayBlockingQueue.offer("b"));
System.out.println(arrayBlockingQueue.offer("c"));
//检测对首元素
System.out.println(arrayBlockingQueue.peek());
//设置队列大小为3,添加第四个时会等待两秒,超时退出
System.out.println(arrayBlockingQueue.offer("d",2, TimeUnit.SECONDS));
System.out.println(arrayBlockingQueue.poll()); //由于队列先进先出特性,抛出也是抛出先添加进队列的元素,并且会返回抛出的元素
System.out.println(arrayBlockingQueue.poll());
System.out.println(arrayBlockingQueue.poll());
//队列中最多可以存三个,所以移除也最多只能移除三个,当移除第四个时,等待两秒,超时退出
System.out.println(arrayBlockingQueue.poll(2,TimeUnit.SECONDS));
}
SynchronousQueue同步队列
没有容量,进去一个元素,必须等待取出来才能往里放一个元素。和其他的BlockingQueue不一样,SynchronousQueue不存储元素,put一个元素,必须从里面take取出来,否则不能存元素