java thread.sleep也让swing ui进入睡眠状态

时间:2010-11-18 14:44:59

标签: java multithreading swing

我正在创建一个简单的测试应用程序,它使用thread.sleep()通过JFileChooser在所选目录上每小时运行一次检查。但是当我选择目录并且方法运行时,ui面板变为灰色并且摆动位消失。该线程似乎正在让ui进入睡眠状态以及它所调用的方法。

if (option == JFileChooser.APPROVE_OPTION) {
    selectedDirectory = chooser.getSelectedFiles();
    try {
        while (true) {
            runCheck(selectedDirectory);
            Thread.sleep(1000*5);//1000 is 1 second
        }
    } catch (InterruptedException e1) {
        Thread.currentThread().interrupt();
        e1.printStackTrace();
    }               
} 

我正在寻找解决此问题的方法,以便我可以打印在ui .setText(结果)中运行的检查结果

3 个答案:

答案 0 :(得分:6)

关于让UI进入睡眠状态的代码是正确的。由于在事件调度线程(负责运行gui的线程)上调用了sleep,因此UI停止处理事件并“进入休眠状态”。

我认为你想要的是javax.swing.Timer

Timer t = new Timer(1000 * 5, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // do your reoccuring task
    }
});

这将导致您的重复任务从EDT执行,因此它不会让您的ui无响应。

答案 1 :(得分:1)

如果您发布的代码在EventDispatchThread上运行,则Swing无法重绘GUI。你正在阻止(沉睡)应该处理它的线程!

答案 2 :(得分:1)

这是因为你正在运行你检查主GUI线程并使用无限循环。此检查是后台任务,应该在其自己的线程中执行,以便GUI仍然可以接收并响应用户的输入。

您也不需要编写自己的实现,Java有一个Timer对象。

编辑:还有一个特定于Swing的Timer对象。这将在GUI线程中发生操作,因此如果您的任务很长,它可能导致GUI在操作发生时仍然锁定(但不是在等待时)。