繁体   English   中英

Thread.Sleep() 正在冻结

[英]Thread.Sleep() is freezing

这是一个片段

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

我使用HTMLEditorKit()HTMLDocument()作为文本框。 文本框应显示“Hello”然后等待一秒钟,但是,当我尝试此操作时,它会等待一秒钟然后输入“Hello”一词,这不是我想要的。

我不确定为什么会这样,因为我按逻辑顺序排列了它。 如果有人可以帮助我解决这个问题,那就太好了。

编辑:

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

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

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

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

您正在EDT(事件调度线程)上调用sleep 您应该避免这种情况,因为确实如此,它会冻结UI。

为了避免这种情况,请改用SwingWorker或按照HFOE的建议使用Swing计时器

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM