0
マルチスレッドについて
[環境]
Swing
Oracle9i
[仕様]
DB登録件数をリアルタイムでJDialogを継承した画面(進捗画面)に表示させる。
進捗画面で「キャンセル」ボタンを押下すると、DB登録を止める。←ここが困っている個所
[困っている個所の説明]
swingはシングルスレッド設計のため、
メインスレッド、サブスレッド(進捗画面表示)、サブスレッド(DB登録)に
分けました。
DB登録、進捗表示はできるのですが、進捗画面で「キャンセル」ボタンを押下した
場合のサブスレッド(DB登録)への割り込みが出来ません。
そもそも、こういったことが出来ないのか、考え方が違うのか・・・
手詰まりになりました。
どなたかご教授のほど、よろしくお願いします。
[簡易ソース]
※現在、開発環境がなく即席でサンプルソースを書きましたので
文法上で何か間違いがあったらすみません。
なんとなくやりたいことが理解してもらえると助かります。
// メインスレッド
public class JDialogTest extends JDialog{
// コンストラクタ
public JDialogTest(){
button = new jButton("OK");
button.addActionListener(this);
}
// OKボタン押下時に登録スレッド(内部クラス)起動
public void actionPerformed(ActionEvent e){
EntryThread entryThread = new EntryThread();
}
// 登録スレッド(内部クラス)
private class EntryThread extends Thread{
// コンストラクタ
public EntryThread(){
this.start();
}
run(){
try{
// 進捗画面起動
// 進捗画面で割り込みたいため、内部クラスを渡す
JDialogProc jDialogProc = new JDialogProc(this);
jDialogProc.show();
// DB登録スレッド起動
ThreadEntry threadEntry = new ThreadEntry(iEntryCnt);
catch(InterruptedException e) {
// キャンセルボタンを押された時にDB登録スレッドも割り込む
// ※ここが問題でどうやら割り込めてない模様・・・
threadEntry.interrpt()
} catch(Exception e){
〜略〜
}
}
}
}
//進捗画面
public class JDialogProc extends JDialog{
// メンバ変数
Thread m_therad = null; //登録スレッド
// コンストラクタ
public JDialogProc(Thead thread){
m_thread = thread;
button = new jButton("Cancel");
button.addActionListener(this);
}
// キャンセルボタン押下で割り込み発生させて
// 登録スレッド(内部クラス)でcatch
public void actionPerformed(ActionEvent e){
m_thread.interrpt()
}
}
//DB登録スレッド
public class ThreadEntry extends Thread{
// メンバ変数
// 登録件数
int m_iEntryCnt = 0;
// コンストラクタ
public ThreadEntry(int iEntryCnt){
m_iEntryCnt = iEntryCnt;
this.start();
}
run(){
try{
// 登録件数分登録
for(int i = 0; i < m_iEntryCnt; i++){
〜略 DB登録〜
}
} catch (Exception e){
// 登録スレッドで割り込み命令を行っても
// 例外処理に来てくれない・・・
}
}
}