Thread.Sleep()冻结

这是一个片段

kit.insertHTML(doc, doc.getLength(), "Hello", 0, 0, null);
try{
Thread.sleep(1000);
}catch(Exception e){}

我使用 HTMLEditorKit()HTMLDocument()作为文本框。 文本框应该显示“你好”,然后等待一秒钟,但是,当我尝试这个时,它等待一秒钟,然后把单词“你好”,这是不是我想要的。

我不知道为什么会发生这种情况,因为我按照逻辑顺序进行了设置。如果有人能帮助我,那会很好。

编辑:

有谁知道替代方案,所以我可以使用“延迟”的效果?

1
额外 编辑
意见: 1
再次使用摆动计时器。请参阅我的答案中的链接。
额外 作者 Hovercraft Full Of Eels,

3 答案

不要在Swing事件线程中调用Thread.sleep(...),因为这会使事件线程本身进入休眠状态。由于此线程负责所有Swing绘画和用户交互,因此这会让您的应用程序进入睡眠状态。

如果您只想要延迟显示,请考虑使用 Swing定时器的。

另一方面,如果事件线程正在被长时间运行的任务所破坏,那么使用SwingWorker(如Guillaume 1+向他建议的那样)在后台执行任务。

6
额外
SwingTimer工作得很好,谢谢
额外 作者 user1357159,
太好了 - 很高兴它有帮助!
额外 作者 Hovercraft Full Of Eels,

您正在EDT上调用 sleep (Event Dispatching Thread)。你应该避免这种情况,因为它冻结了用户界面。

为避免出现这种情况,请改用 SwingWorker 或者按照HFOE的建议,使用摆动计时器

3
额外
是的。 1+并同意。
额外 作者 Hovercraft Full Of Eels,
@HovercraftFullOfEels +1给你也;-)
额外 作者 Guillaume Polet,

Thread.sleep is a long running task. When you a running such a task in the EDT it blocks all repaint requests from being executed. All repaint requests which are pending and which were sent during the sleep phase are queued for future processing.

因此,当EDT从 sleep 阶段出来时,它会将所有重新绘制请求(如果启用了默认属性的合并)合并为一个执行的重新绘制。如果未启用合并,则所有排队的请求都会连续执行,而两者之间没有任何时间间隔。因此,UI似乎没有更新。

要纠正这种情况,请使用在特定时间间隔后定期触发的 SwingTimerSwingWorker

0
额外