java线程通信

1.简单连接池实例

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
public class  {
private LinkedList<Connection> pool = new LinkedList<Connection>();
private int COUNT_INIT;
private int COUNT_MAX; //最大连接数
private volatile int COUNT_CURRENT = 0; //当前连接数量
private String DRIVER_CLASS;
private String URL;
private String USER_NAME;
private String PASSWORD;
private Lock lock = new ReentrantLock();
private Condition c = lock.newCondition();

public (Properties properties) {
COUNT_INIT = Integer.parseInt(properties.getProperty("initialSize"));
COUNT_MAX = Integer.parseInt(properties.getProperty("maxActive"));
DRIVER_CLASS = properties.getProperty("driverClass");
URL = properties.getProperty("url");
USER_NAME = properties.getProperty("userName");
PASSWORD = properties.getProperty("password");
try {
Class.forName(DRIVER_CLASS);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
for(int i=0;i<COUNT_INIT;i++){
try {
pool.add(DriverManager.getConnection(URL,USER_NAME,PASSWORD));
COUNT_CURRENT++;
} catch (SQLException e) {
e.printStackTrace();
}
}
}

//获取连接
public Connection getConnection(){
Connection result = null;
lock.lock();
try {
while (pool.isEmpty() && COUNT_CURRENT >= COUNT_MAX) {
c.await(); //如果连接池为空且连接数已经达到最大则等待
}
if (pool.isEmpty()&&COUNT_CURRENT < COUNT_MAX) {
result = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
COUNT_CURRENT++;
}
else{
result = pool.removeLast();
}
}catch(Exception e){
e.printStackTrace();
}
finally{
lock.unlock();
}
return result;
}

//释放连接
public void release(Connection connection){
lock.lock();
try {
if(pool.size()<COUNT_INIT){
pool.push(connection);
c.signal();
}
else{
connection.close();
COUNT_CURRENT--;
}
}catch(Exception e){
e.printStackTrace();
}
finally{
lock.unlock();
}
}
}