并发容器BlockingQueue

前言

今天在开发activiti demo项目中,需要查询下一个usertask,对网关遍历和el表达式的判断。需要根据数组不断查询下一个,查询过程中需要对数组add和rm,这时候,我想到了 BlockingQueue。

BlockingQueue 简介

  • 阻塞队列(BlockingQueue)被广泛使用在“生产者-消费者”问题中,其原因是 BlockingQueue 提供了可阻塞的插入和移除的方法。当队列容器已满,生产者线程会被阻塞,直到队列未满;当队列容器为空时,消费者线程会被阻塞,直至队列非空时为止。
  • 阻塞队列与我们平常接触的普通队列(LinkedList或ArrayList等)的最大不同点,在于阻塞队列提供了阻塞添加和阻塞删除的方法。

BlockingQueue接口

并发容器BlockingQueue_第1张图片

add(E e) :往队列插入数据,当队列满时,插入元素时会抛出 IllegalStateException 异常。
offer(E e):当往队列插入数据时,插入成功返回true,否则则返回false。当队列满时不会抛出异常。
put:当阻塞队列容量已经满时,往阻塞队列插入数据的线程会被阻塞,直至阻塞队列已经有空余的容量可供使用。
offer(E e, long timeout, TimeUnit unit):若阻塞队列已经满时,同样会阻塞插入数据的线程,直至阻塞队列已经有空余的地方,与 put 方法不同的是,该方法会有一个超时时间,若超过当前给定的超时时间,插入数据的线程会退出。
remove(Object o):从队列中删除数据,成功则返回true,否则为falsepoll:删除数据,当队列为空时,返回 null。
take():当阻塞队列为空时,获取队头数据的线程会被阻塞。
poll(long timeout, TimeUnit unit):当阻塞队列为空时,获取数据的线程会被阻塞,另外,如果被阻塞的线程超过了给定的时长,该线程会退出。

常用的BlockingQueue

  1. ArrayBlockingQueue
    规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小。其所含的对象是以FIFO(先入先出)顺序排序的。
  2. LinkedBlockingQueue
    大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定。其所含的对象是以FIFO(先入先出)顺序排序的。
  3. PriorityBlockingQueue
    类似于LinkedBlockQueue。但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序。
  4. SynchronousQueue
    特殊的BlockingQueue,对其的操作必须是放和取交替完成的。

你可能感兴趣的:(java,队列)