【问题标题】:java thread.sleep puts swing ui to sleep toojava thread.sleep 也让 swing ui 进入睡眠状态
【发布时间】:2011-05-12 02:04:05
【问题描述】:

我正在创建一个简单的测试应用程序,它通过 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) 中运行的检查结果

【问题讨论】:

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

标签: java multithreading swing


【解决方案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 无响应。

【讨论】:

【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 您链接到的计时器是util 包中的一个。与swing组件交互时,应使用swingTimer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多