1

嗨,我遇到了以下问题......我的主 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 中(while 条件),因为在我点击“测试”后窗口很忙。即使实现可运行并将测试方法放入“run()”也不起作用。

测试按钮源代码:

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();
                }
4

1 回答 1

5

您正在阻塞事件调度线程。使用SwingWorker完成繁重的任务。将主数据库操作放入doInBackround(),并publish()用于中间结果。

如果您需要在doInBackround()完成之前停止它,您可以使用cancel(). 请参阅此处了解有关说明。

于 2013-08-20T11:49:32.587 回答