您好我有以下问题... 我有这样的主jframe:
public static void main (String args[]){
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Form3 myF=new Form3();
}
});
};
在jframe中我有Jpanels。在jpanel上我想开始第二个帖子。 我试过这样的话:
try {
while (DBAccess.haveResult("ASS"+harnessId)==null&&cancelCycle == 0) {
thread1.sleep(3*1000);
System.out.println("+++++++++");
System.out.println(DBAccess.haveResult("ASS"+harnessId));
res = DBAccess.haveResult("ASS"+harnessId);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
但我无法阻止该线程,甚至无法取消它,因为主窗口停止响应
澄清我的问题: 我在JPanel上有“测试”按钮,它正在开始测试过程。测试过程包括循环,每3秒重复一次,此循环检查数据库状态。问题是我无法停止此循环,直到状态出现在db(条件)中,因为我点击“test”后窗口很忙。即使实现runnable并将测试方法放入“run()”也无效。
testbutton源代码:
if (e.getActionCommand().equals("Test")){
run();}
运行方法:
@Override
public final void run() {
test();
}
测试方法:
Map result_row = DBAccess.addRow("ASS"+harnessId,htOperList.get(seqNumber-1).getNametestprogram(),"",null);
if(result_row.containsKey("ADDROW")){System.out.println("Record inserted" );}
Database db = null;
Map res = null;
try {
while (DBAccess.haveResult("ASS"+harnessId)==null&&cancelCycle == 0) {
thread1.sleep(3*1000);
System.out.println(DBAccess.haveResult("ASS"+harnessId));
res = DBAccess.haveResult("ASS"+harnessId);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
答案 0 :(得分:5)
您正在阻止事件派发线程。使用SwingWorker执行繁重的任务。将主数据库操作放在doInBackround()
中,并使用publish()
作为中间结果。
如果您需要在doInBackround()
完成之前停止,可以使用cancel()
。有关这方面的说明,请参阅here。