首页 > Java > java教程 > 正文

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

Linda Hamilton
发布: 2024-11-02 14:44:03
原创
304 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!