目录
1、队列遵循先进先出的原则FIFO
2、阻塞队列最大的好处就是能防止队列容器溢出,防止数据丢失
3、非阻塞队列是无界的,使用offer来增加数据,poll来取出数据
一、非阻塞式队列
简单代码示例:
import java.util.concurrent.ConcurrentLinkedQueue;
public class QueueTestOrder {
// 阻塞队列最大的好处就是嫩巩固防止队列容器溢出,防止丢失数据
public static void main(String[] args) {
ConcurrentLinkedQueue<Object> concurrentLinkedQueue = new ConcurrentLinkedQueue<>();
concurrentLinkedQueue.offer("张三");
concurrentLinkedQueue.offer("李四");
concurrentLinkedQueue.offer("王五");
// 获取队列,只能获得第一个元素(FIOF)
System.out.println(concurrentLinkedQueue.poll());
System.out.println(concurrentLinkedQueue.poll());
System.out.println(concurrentLinkedQueue.poll());
System.out.println(concurrentLinkedQueue.poll());
// 获取队列个数
System.out.println(concurrentLinkedQueue.size());
}
}
执行结果:
二、阻塞队列
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;
public class QueueBlock {
// 如果存队列的时候,如果队列满了就会等待,如果取队列的时候,如果队列为空,也会等待
public static void main(String[] args) throws InterruptedException {
// 最多支持3个队列总数,阻塞式队列
ArrayBlockingQueue<Object> blockingQueue = new ArrayBlockingQueue<>(3);
blockingQueue.offer("张三");
blockingQueue.offer("李四");
blockingQueue.offer("王五");
blockingQueue.offer("赵六", 3, TimeUnit.SECONDS);
// 使用peek方法会从取出队列的第一个,但是不会移除
System.out.println(blockingQueue.peek());
System.out.println(blockingQueue.poll());
System.out.println(blockingQueue.poll());
// 这里还有数据,不会阻塞
System.out.println(blockingQueue.poll(3, TimeUnit.SECONDS));
// 只有到最后一个取不到数据时才会阻塞
System.out.println(blockingQueue.poll(3, TimeUnit.SECONDS));
System.out.println(blockingQueue.poll());
}
}
执行结果:
注意:
1、队列中如果没有存满,存入数据后会返回true,否则会阻塞并返回false
2、队列中如果数据还没有取完,不会等待,只有在最后一个数据被取完之后执行poll才阻塞
三、阻塞队列与线程池的关系
线程池对应的阻塞队列
线程池 | 阻塞队列 |
---|---|
FixedThreadPool | LinkedBlockingQueue |
SingleThreadExecutor | LinkedBlockingQueue |
CachedThreadPool | SynchronousQueue |
ScheduledThreadPool | DelayedWorkQueue |
SingleThreadScheduledExecutor | DelayedWorkQueue |