我是使用wait和notify的新手。我在测试代码时遇到了麻烦。以下是我的实现:(注意:我没有包含所有实现)
public class PoolImp {
private Vector<Connection> connections; // For now maximum of 1 connection
public synchronized Connection getconnection() {
if(connections.size == 1() ) {
this.wait();
}
return newConnection(); // also add to connections
}
public synchronized void removeconnection() {
connections.size = 0;
this.notify();
}
}
以下是我的测试方法:conn_1获得第一个连接。 conn_2进入等待状态,因为只允许最多1个连接。
我想以这样一种方式测试它:当我调用removeconnection时,conn_2会得到通知并获得释放的连接。
测试: @Test
public void testGetConnections() throws SQLException
{
PoolImpl cp = new PoolImpl();
Connection conn_1 = null;
Connection conn_2 = null;
conn_1 = cp.getConnection();
conn_2 = cp.getConnection();
cp.removeConnection(conn_1);}
}
答案 0 :(得分:2)
为了测试等待和通知,您需要多个线程。否则,等待的线程将阻塞,并且永远不会到达通知代码,因为它在同一个线程上。
P.S。实施connection pools并非易事。我不会打扰,因为you can use ready-made ones。
答案 1 :(得分:0)
每个人都应该为你的连接池带一个现成的课程。但如果你坚持,我已经为你修改了代码:
public class PoolImp {
private Vector<Connection> connections; // For now maximum of 1 connection
public synchronized Connection getconnection() {
while(connections.isEmpty()) {
this.wait();
}
return newConnection();
}
public synchronized void removeconnection(Connection c) {
connections.add(c);
this.notify();
}
}
答案 2 :(得分:0)
用while循环替换if块是一种改进,但不能解决这里的实际问题。在发出通知后,它只会强制对集合的大小进行另一次检查,以确保在发出notify()时声明的有效性。
如前所述,您需要多个客户端线程来模拟这一点。调用时,您的测试线程被阻止 conn_2 = cp.getConnection();
现在,它永远不会有机会发出此调用,因为它将无限期地等待(除非它被中断) cp.removeConnection(conn_1);