前言
最近公司项目涉及到硬件,需要给机器发送指令,过程是这样的:
- 首先是发送指令不能并发执行,要等到该指令响应结束才能发起第二条指令
- 两台设备一起执行任务,会有一台丢失响应数据,所以过个设备需要逐个执行任务
上述两种情况都再引导我要使用队列了
并行和并发区别
1、并行是指两者同时执行一件事,比如赛跑,两个人都在不停的往前跑;
2、并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率
队列属性
队列实现的是一种先入先出(FIFO)策略,队列的先入先出特性如同生活中的排队现象一样。因为队列既有队头,又有队尾,所以在实现是需要一个数组和两个分别指向对头和队尾的属性。关于队列属性,现有以下说明:
- 队头属性指向队头元素所在位置,队尾属性指向队尾元素的下一个位置,即下一个元素即将插入的位置。
- 为防止队列的队头移动会引起数组前端空间的浪费,一般设置队头和队尾两属性循环移动。
- 当队尾元素加一取模等于队头元素时,说明此队列存储空间已满。
- 当队头元素和队尾元素相等时,说明此队列为空。
队列实现
无界限线程安全, 非阻塞,基于链接节点,元素按FIFO原则进行排序,不允许使用null元素,否则抛NullPointerException,常用函数:
- add(E e): 内部执行的是offer()函数
- offer(E e): 在队列的尾部插入指定的元素。由于队列是无界的,此方法将永远不会返回false
- poll(): 从队列取出元素并且删除该元素
- peek(): 获取但不移除此队列的头
- remove(Object o): 从队列中移除制定的元素,如果存在返回true 反之false
- isEmpty():
- size():
- contains(Object o): 如果此队列包含指定元素,则返回 true
详细原理参考: http://ifeve.com/concurrentlinkedqueue/
1 |
|
LinkedBlockingQueue
线程安全,阻塞队列,可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE
阻塞队列概要:
- 阻塞添加-所谓的阻塞添加是指当阻塞队列元素已满时,队列会阻塞加入元素的线程,直队列元素不满时才重新唤醒线程执行元素加入操作。
- 阻塞删除-阻塞删除是指在队列元素为空时,删除队列元素的线程将被阻塞,直到队列不为空再执行删除操作(一般都会返回被删除的元素)
操作函数:
- add(E e) : 添加成功返回true,失败抛IllegalStateException异常
- offer(E e) : 成功返回 true,如果此队列已满,则返回 false。
- put(E e) :将元素插入此队列的尾部,如果该队列已满,则一直阻塞
- remove(Object o) :移除指定元素,成功返回true,失败返回false
- poll() : 获取并移除此队列的头元素,若队列为空,则返回 null
- take():获取并移除此队列头元素,若没有元素则一直阻塞。
- element() :获取但不移除此队列的头元素,没有元素则抛异常
- peek() :获取但不移除此队列的头;若队列为空,则返回 null。
1 |
|
打印结果:
1 | -------->result: 0 |
还有以下实例我都加入了API超链接,就不一一举例
ArrayBlockingQueue
DelayQueue
PriorityBlockingQueue
SynchronousQueue
上述都继承自AbstractQueue