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

Posted

技术标签:

【中文标题】java thread.sleep 也让 swing ui 进入睡眠状态【英文标题】:java thread.sleep puts swing ui to sleep too 【发布时间】:2014-01-11 04:52:27 【问题描述】:

我正在创建一个简单的测试应用程序,它通过 JFileChooser 使用 thread.sleep() 每小时对所选目录运行一次检查。但是当我选择目录并且方法运行时,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(result) 中运行的检查结果

【问题讨论】:

可能是SwingWorker? download.oracle.com/javase/6/docs/api/javax/swing/… 考虑使用 Timer 和 TimerTask 来运行定时任务。它会更可靠。 @Andrew,实际上应该使用javax.swing.Timer 而不是 util 包中的 Timer。 @jjnguy,我只是想指出,一般来说,在 while 循环中使用 sleep 并不是一个及时重复任务的好方法,还有一种更可靠的方法。但是,是的,在这种情况下你是正确的。 :P 【参考方案1】:

您对使 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 无响应。

【讨论】:

"请注意,Swing 计时器的任务是在事件派发线程中执行的。这意味着该任务可以安全地操作组件,但也意味着该任务应该快速执行。" download.oracle.com/javase/tutorial/uiswing/misc/timer.html【参考方案2】:

如果您发布的代码在 EventDispatchThread 上运行,则 Swing 无法重绘 GUI。您正在阻塞(休眠)应该处理该问题的线程!

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

您链接到的计时器是util 包中的一个。与swing组件交互时,应使用swingTimer

以上是关于java thread.sleep 也让 swing ui 进入睡眠状态的主要内容,如果未能解决你的问题,请参考以下文章

Java:关于Thread.sleep()

JAVA,Thread.sleep()问题

java Thread.sleep卡死问题

Java - 替代 thread.sleep

Java的Thread.sleep啥时候抛出InterruptedException?

Java中的线程的休眠Thread.sleep()