在JButton上行动后避免冻结

时间:2011-12-12 01:49:37

标签: java multithreading jbutton synchronized

我对Java很陌生,所以我很抱歉这个初学者的问题。

我有一个JButton,当我点击它时,会触发一些MySQL查询,并且显示器中的一些更新需要2或3秒。在此期间,我的用户界面完全冻结。有没有办法避免这种情况? 也许我应该使用像synchronized,thread或runnable这样的东西,但我不太了解。 有人可以解释一下吗?

非常感谢。

问候。

文森特

1 个答案:

答案 0 :(得分:3)

因为您在与用户界面相同的线程上执行查询,所以该线程在此期间无法接收任何用户命令,因此它“冻结”。

解决方案是启动一个新线程并并行执行查询,然后使用类似SwingUtilities.invokeLater的内容来更新ui。类似的东西:

 // button action listener code

 Thread t = new Thread(new Runnable() {
    public void run() {

       // execute query here

       SwingUtilities.invokeLater(new Runnable() {
           public void run() {

               // update the ui here

           }
       });
    }
 });
 t.start();

SwingUtilities.invokeLater有效地对更新操作进行排队,直到UI线程上的所有待处理事件都已处理完毕。阅读javadoc here