Thread.Sleep()冻结了

时间:2012-05-21 17:36:42

标签: java applet

这是一个片段

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

我使用HTMLEditorKit()HTMLDocument()作为文本框。 文本框应该显示“Hello”然后等待一秒然而,当我尝试这个时,它会等待一秒然后放置“Hello”这个不是我想要的。

我不确定为什么会这样,因为我把它按逻辑顺序排列。如果有人能帮助我,那就太好了。

编辑:

有没有人知道另一种选择,所以我可以使用“延迟”效果吗?

3 个答案:

答案 0 :(得分:6)

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

如果您只想延迟显示,请考虑使用Swing Timer

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

答案 1 :(得分:3)

您正在EDT(事件调度线程)上调用sleep。你应该避免这种情况,因为它冻结了用户界面。

要避免这种情况,请使用SwingWorker代替或按照HFOE的建议,使用Swing Timer

答案 2 :(得分:0)

Thread.sleep是一项长期任务。当您在EDT中运行此类任务时,它会阻止执行所有重新绘制请求。所有待处理的重绘请求和在睡眠阶段发送的重新排序请求都会排队等待以后处理。

结果,当EDT退出sleep阶段时,它将所有这样的重绘请求(如果启用了合并,这是默认属性)合并为一个重新执行的执行。如果未启用合并,则所有排队的请求将按顺序执行,两者之间没有任何时间间隔。结果似乎UI没有更新。

要纠正这种情况,请使用SwingTimer,该SwingWorker会在特定时间间隔后定期触发,或{{1}}。