-
Notifications
You must be signed in to change notification settings - Fork 7.1k
/
Copy pathArrayQueue.java
129 lines (103 loc) · 2.27 KB
/
ArrayQueue.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package com.crossoverjie.concurrent;
/**
* Function: 数组实现的线程安全阻塞队列
*
* @author crossoverJie
* Date: 2019-04-04 15:02
* @since JDK 1.8
*/
public final class ArrayQueue<T> {
/**
* 队列数量
*/
private int count = 0;
/**
* 最终的数据存储
*/
private Object[] items;
/**
* 队列满时的阻塞锁
*/
private Object full = new Object();
/**
* 队列空时的阻塞锁
*/
private Object empty = new Object();
/**
* 写入数据时的下标
*/
private int putIndex;
/**
* 获取数据时的下标
*/
private int getIndex;
public ArrayQueue(int size) {
items = new Object[size];
}
/**
* 从队列尾写入数据
* @param t
*/
public void put(T t) {
synchronized (full) {
while (count == items.length) {
try {
full.wait();
} catch (InterruptedException e) {
break;
}
}
}
synchronized (empty) {
//写入
items[putIndex] = t;
count++;
putIndex++;
if (putIndex == items.length) {
//超过数组长度后需要从头开始
putIndex = 0;
}
empty.notify();
}
}
/**
* 从队列头获取数据
* @return
*/
public T get() {
synchronized (empty) {
while (count == 0) {
try {
empty.wait();
} catch (InterruptedException e) {
return null;
}
}
}
synchronized (full) {
Object result = items[getIndex];
items[getIndex] = null;
count--;
getIndex++;
if (getIndex == items.length) {
getIndex = 0;
}
full.notify();
return (T) result;
}
}
/**
* 获取队列大小
* @return
*/
public synchronized int size() {
return count;
}
/**
* 判断队列是否为空
* @return
*/
public boolean isEmpty() {
return size() == 0;
}
}