在单线程中使用 sleep()
在 Java 中,wait() 和 sleep() 用于处理线程同步。但是,当在运行其他线程时尝试在单个线程上使用 sleep() 时,可能会出现问题。
问题:
在一个线程上调用 sleep() 时,两个线程似乎都暂停执行指定的持续时间。为什么会发生这种行为?
答案:
使用 Swing GUI 时,一个不同于主线程和其他线程的唯一线程负责其创建。该线程称为事件调度线程 (EDT)。如果在 EDT 上调用 sleep(),它将暂停执行,直到调用完成。
由于 GUI 事件处理发生在 EDT 上,因此该线程上的任何睡眠操作都会暂停事件处理,导致 UI 看起来冻结直到睡眠() 结论。
解决方案:
避免在 EDT 或 sleep() 会导致意外执行阻塞的线程上使用 Thread.sleep()。或者,考虑以下选项:
注意:
对于 Java 1.6 或更高版本,Swing Timer 和 Swing Worker 是在 EDT 上延迟操作的首选选项。对于早期的 Java 版本,TimerTask 或 Thread 可以与 SwingUtilities/EventQueue#invokeXX 块结合使用,以确保 UI 响应能力。
以上是为什么在事件调度线程上调用 `sleep()` 会冻结 GUI?的详细内容。更多信息请关注PHP中文网其他相关文章!