在 DbInterface 类中,函数 openDB() 打开与服务器上的 Oracle DB 的连接。出于安全原因,用户必须在 JFrame 文本区域中输入密码,然后程序才能继续连接。现在这个 Jframe 有一个动作监听器,它等待用户输入密码并调用 OpenDBContinue() 方法。
现在的问题是:openDB() 不会等待 Jframe IO 完成并假设 DB 已打开,将控制权返回给调用类(调用 openDB() 的人),然后他们继续开始查询显然失败的 DB!
现在如何让 openDB() 等待 Jframe IO 完成?这是给你一个想法的代码。
public void openDB(int inFileInx,String inRemoteDBURLFull) throws FileNotFoundException
{
if(this.password!=null)
try
{ openDBcontinue(inFileInx,inRemoteDBURLFull);
}
catch(Exception exp)
{ DpmLogger.dtlException("SPDBInterfaceException:OpenDB", exp);
}
else {
passwd = new JFrame();
passwd.setLocation(SpdMain.bTabbedPanel.getWidth()/2,SpdMain.bTabbedPanel.getHeight()/2);
passwd.setTitle("Enter Passwd for user "+username);
JPasswordField p =new JPasswordField(10);
p.addActionListener(this);
p.setActionCommand(inFileInx+","+inRemoteDBURLFull);
passwd.add(p);
passwd.setPreferredSize(new Dimension(300,50));
passwd.pack();
passwd.setVisible(true);
pass=new Thread(new Runnable()
{
public void run() {
DpmLogger.dtlTraceOut("The password thread has completed and has got password from the user",DpmLogger.TRACE_RARE,myId);
}
});
try {
pass.join();
} catch (InterruptedException e)
{
DpmLogger.dtlTraceOut("Password thread unable to join",DpmLogger.TRACE_RARE,myId);
}
DpmLogger.dtlTraceOut("Password thread now joined",DpmLogger.TRACE_RARE,myId);
}
}
public void actionPerformed(ActionEvent e)
{ JTextField p=(JTextField)e.getSource();
if(password==null)
password=p.getText();
passwd.setVisible(false);
String[] inVars=e.getActionCommand().split(",");
try
{ openDBcontinue(Integer.parseInt(inVars[0]),inVars[1]);
pass.start();
}
catch(Exception exp)
{ DpmLogger.dtlException("SPDBInterfaceException:OpenDB", exp);
}
}
如您所见,我正在尝试使该方法在带有 join() 的“通过”线程上等待。当 IO 完成时,动作监听器启动 pass 线程。但它不起作用。OpenDB() 无需等待“通过”运行即可返回。这是因为该方法不在线程内吗?我必须让这个 DBInterface 类扩展 Thread 类吗?我很困惑!