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