2013-08-20 27 views
1
运行2个线程

嗨,我得到了下面的问题...... 我有主JFrame的开始是这样的。在jpanel上,我想开始第二个线程。 我试着这样说:如何在JFrame中

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 condition)中,因为在点击“test”后窗口很忙。即使实现runnable并将测试方法放入“run()”也不起作用。

testbutton源代码:

if (e.getActionCommand().equals("Test")){ 
      run();} 

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

如果窗口停止反应,这意味着循环不会在单独的线程中运行,而是在导致UI冻结的事件调度线程中运行。告诉我们你如何声明,初始化和启动你的线程。 –

+0

添加了更多源代码 – Michael

+2

您不需要通过调用Runnable的run()方法来启动线程。这只是调用当前线程中的方法。阅读[并发教程](http://docs.oracle.com/javase/tutorial/essential/concurrency/index.html)。 –

回答

5

您阻塞事件调度线程。对于繁重的任务使用SwingWorker。将主要数据库操作放入doInBackround(),并使用publish()获取中期业绩。

如果您需要在doInBackround()完成之前停止它,则可以使用cancel()。有关这方面的说明,请参阅here