如何使用和测试等待和通知

时间:2012-01-31 18:06:01

标签: java wait notify

我是使用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);}
}   

3 个答案:

答案 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);