首页 >Java >java教程 >为什么 Thread.sleep() 会冻结我的 Swing UI?

为什么 Thread.sleep() 会冻结我的 Swing UI?

Linda Hamilton
Linda Hamilton原创
2024-11-02 14:44:03415浏览

Why Does Thread.sleep() Freeze My Swing UI?

Java 的 Thread.sleep() 对 Swing UI 的影响

在 Java 中,在基于 Swing 的应用程序中利用 Thread.sleep()可能会产生意外后果,即暂停整个用户界面,使其失去响应。

问题描述:

考虑以下代码片段:

<code class="java">// Code to create a simple Swing-based application
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();
    }   
} </code>

该应用程序在执行检查之前使用 Thread.sleep() 暂停 5 秒。然而,在此睡眠期间,用户界面变得无响应并呈灰色。

UI 不活动的原因:

Thread.sleep() 暂停调用它的线程,在本例中为事件调度线程 (EDT)。 EDT 负责处理所有 GUI 事件并呈现用户界面。因此,当 EDT 进入睡眠状态时,UI 停止响应输入并更新其显示。

替代方法:

为了避免冻结 UI,适当的解决方案是使用 javax.swing.Timer。计时器可以安排任务在 EDT 后按指定的时间间隔执行:

<code class="java">Timer t = new Timer(1000 * 5, new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // do your recurring task
    }
});</code>

在这种情况下,执行检查的任务计划在 EDT 后每 5 秒运行一次,从而允许 UI 保持不变在检查运行时响应。

以上是为什么 Thread.sleep() 会冻结我的 Swing UI?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn