1

我是使用等待和通知的新手。我在测试我的代码时遇到了麻烦。下面是我的实现:(注意:我没有包括所有的实现)

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);}
}   
4

3 回答 3

2

为了测试等待和通知,您需要多个线程。否则,等待线程将阻塞,并且永远不会到达通知代码,因为它在同一个线程上。

PS 实现连接池并非易事。我什至不会打扰,因为您可以使用现成的

于 2012-01-31T18:13:20.893 回答
0

用 while 循环替换 if 块是一种改进,但不会解决这里的真正问题。它只会在发出通知后强制对集合的大小进行另一次检查,以确保发出通知()时提出的声明的有效性。

如前所述,您需要多个客户端线程来模拟这一点。当您调用 conn_2 = cp.getConnection(); 时,您的测试线程被阻止

现在,它永远没有机会发出这个调用,因为它将无限期地等待(除非它被中断) cp.removeConnection(conn_1);

于 2012-01-31T19:51:43.297 回答
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();
  }

}

于 2012-01-31T18:33:41.023 回答