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

Java 如何使用和测试等待和通知,java,wait,notify,Java,Wait,Notify,我不习惯使用等待和通知。我在测试代码时遇到困难。下面是我的实现:(注意:我没有包括所有的实现) 为了测试等待和通知,您需要多个线程。否则,等待的线程将阻塞,并且永远不会到达通知代码,因为它位于同一线程上 p.S.的实施并非易事。我甚至不想麻烦,因为。大家好,你们应该为你们的连接池准备一门现成的课程。但是如果你坚持,我已经为你修改了代码: public class PoolImp { private Vector<Connection> connections; // For no

我不习惯使用等待和通知。我在测试代码时遇到困难。下面是我的实现:(注意:我没有包括所有的实现)


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


p.S.的实施并非易事。我甚至不想麻烦,因为。

大家好,你们应该为你们的连接池准备一门现成的课程。但是如果你坚持,我已经为你修改了代码:

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();
  }
公共类PoolImp{
私有向量连接;//目前最多1个连接
公共同步连接getconnection(){
while(connections.isEmpty()){
这个。等等();
}
返回newConnection();
}
公共同步的void removeconnection(连接c){
添加(c);
this.notify();
}

}

用while循环替换if块是一种改进,但不能解决实际问题。它只需在发出notify()后强制再次检查集合的大小,以确保在发出notify()时所做声明的有效性

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

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

这不是
wait()
notify()
的意思。什么是
1()
?wait()可能会错误返回,因此您需要使用while loop.FYI。有许多连接池实现。说出一对夫妇的名字——还有。如果现在的轮子能帮你完成任务,就不需要再发明轮子了。好吧!!谢谢各位。。让我看看我能做什么…正确使用这些方法是非常困难的。你失败了。使用更高级别的抽象,如阻塞队列,它将为您完成所有等待/通知脏任务。。我以为“这”是synchronized@user1180969哦,你说得对,我错过了你方法中的
synchronized
!我马上就搞定答案。。。
 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);}
}   
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();
  }