-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPool.java
More file actions
59 lines (54 loc) · 1.24 KB
/
Pool.java
File metadata and controls
59 lines (54 loc) · 1.24 KB
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
package Chapter21.Concurrency;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Semaphore;
public class Pool<T>{
private int size;
private List<T> items = new ArrayList<T>();
private volatile boolean[] checkedOut;
private Semaphore available;
public Pool(Class<T> classObject,int size) {
this.size = size;
//初始为false
checkedOut = new boolean[size];
available = new Semaphore(size,true);
for(int i=0;i<size;i++) {
try {
items.add(classObject.newInstance());
}catch(Exception e) {
throw new RuntimeException();
}
}
}
public T checkOut() throws InterruptedException {
available.acquire();
return getItem();
}
public void checkIn(T x) {
if(releaseItem(x)) {
available.release();
}
}
//获取池中为false的对象
private synchronized T getItem() {
for(int i=0;i<size;i++) {
if(!checkedOut[i]) {
checkedOut[i] = true;
return items.get(i);
}
}
return null;
}
private synchronized boolean releaseItem(T item) {
int index = items.indexOf(item);
if(index == -1) {
return false;
}
//true的说明是已经被用的
if(checkedOut[index]) {
checkedOut[index] = false;
return true;
}
return false;
}
}