DbInterfaceクラスでは、関数openDB()がサーバー上のOracleDBへの接続を開きます。セキュリティ上の理由から、プログラムが接続を続行する前に、ユーザーは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()を使用してメソッドを「pass」スレッドで待機させようとしています。アクションリスナーは、IOが終了するとパススレッドを開始します。しかし、それは機能しません。OpenDB()は、「pass」の実行を待たずに戻ります。これは、メソッドがスレッド内にないためですか?このDBInterfaceクラスにThreadクラスを拡張させる必要がありますか?私は混乱しています!