BlockingQueue(阻塞队列)
ArrayBlockingQueue
ArrayBlockingQueue用于解决多线程问题:生产者消费者案例
ArrayBlockingQueue对象在初始化的时候需要指定其容量。
对于这个队列的操作,给出三种操作方法: 插入、移除、检查
ArrayBlockingQueue对于这三种操作方法,给出了四套解决方案:
- 抛出异常(插入时队满,或移除时队空 抛出异常 IllegalStateException:Queue full 或 NoSuchElementExcept)
- 特殊值(插入或移除失败时,返回特殊值:null或false)
- 阻塞(插入或移除失败时,会阻塞等待,等待队列有空位或者有元素)
- 超时(插入或移除失败时,会阻塞等待,等待队列有空位或者有元素,但是可以设置具体超时等待时间)
方法类型 | 抛出异常 | 特殊值 | 阻塞 | 超时 |
插入 | add(e) | offer(e) | put(e) | offer(e,time,unit) |
移除 | remove() | poll() | take() | poll(time,unit) |
检查 | element() | peek() | 不可用 | 不可用 |
- 检查element() 给出队首的元素
运行结果:
代码:
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; /** * @author zkw * @Description TODO */ public class BlockingQueueDemo { public static void main(String[] args) throws InterruptedException { BlockingQueue<String> blockingQueue = new ArrayBlockingQueue<>(3); new Thread(()->{ for (int i = 0; i < 4; i++) { try { blockingQueue.offer(i+"", 3, TimeUnit.SECONDS); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); new Thread(()->{ for (int i = 0; i < 4; i++) { try { System.out.println(blockingQueue.poll(3, TimeUnit.SECONDS)); } catch (InterruptedException e) { e.printStackTrace(); } } }).start(); } }