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

sle*_*lex 4 java swing multithreading

我正在创建一个简单的测试应用程序,它使用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();
    }               
} 
Run Code Online (Sandbox Code Playgroud)

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

jjn*_*guy 6

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

我想你想要的是一个javax.swing.Timer.

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

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

  • "请注意,Swing计时器的任务是在事件调度线程中执行的.这意味着任务可以安全地操作组件,但这也意味着任务应该快速执行." http://download.oracle.com/javase/tutorial/uiswing/misc/timer.html (2认同)