【问题标题】:Thread.sleep(xx) but the whole program sleeps?Thread.sleep(xx) 但整个程序都在休眠?
【发布时间】:2011-06-17 20:10:06
【问题描述】:

嘿..我有一个程序可以签入一些人..如果他们有一个部门,程序将显示一个带有列表的面板..

所以我想在几秒钟后将面板设置为不可见.. 我该怎么做?

我创建了一个新线程(FadeThread)并在视图中启动它,但是现在,当我写的时候

Thread.sleep(5000)

整个程序休眠 5 秒,.. 我只想在后台等待 5 秒并将面板设置为可见(false)但整个 UI 和程序休眠..

谢谢...

【问题讨论】:

  • 提供一个简短的代码示例对我们帮助您大有帮助:)
  • 您是在调用 run 而不是 start (还是反过来)? IIRC,如果你直接调用 run ,它实际上不会启动一个新线程,而只是在当前线程的上下文中运行线程的“main方法”。

标签: java multithreading sleep


【解决方案1】:

Thread.sleep() 将暂停当前线程,我认为这是您的情况下的事件调度程序线程。如果您在后台线程中执行此操作,它应该可以工作,但如果您不小心调用run() 而不是start(),它不会。

要以设定的延迟执行代码,您必须使用 Timer 类。更干净,您不必担心意外创建太多线程,无法正确退出线程等等。

【讨论】:

  • @berry120 Timer 绰绰有余,你当然会使用invokeLater() 更新UI。
  • @biziclop 好点,使用invokeLater() 更新它是线程安全的。不过,我仍然提倡使用 ScheduledExecutor。
  • 让我们明确一点(因为 Sun 不是)。 JDK 中有两个Timer 类:java.util.Timerjavax.swing.Timer。后者是专门为使用 Swing UI 而创建的:它在 EDT 上触发 ActionEvents,因此您可以安全地更新组件。更多详情请看这篇文章:java.sun.com/products/jfc/tsc/articles/timer
  • 你很好 - 我用 run 启动了线程所以它没有工作.. 现在用 .start() 它工作正常 :)
  • @Hovercraft Full Of Eels - 非常高兴地承认我错了,这次我是(曾经)。我的大脑突然进入 java.util.Timer,因为我之前正在查看一个关于它的问题!
【解决方案2】:

您正在导致事件调度线程休眠,因此 GUI 无法对事件做出反应。

阅读 Concurrency 上的 Swing 教程部分,了解更多信息和潜在的解决方案。

【讨论】:

    【解决方案3】:

    假设您使用的是 Swing,请查看 SwingWorker 类。您可以创建一个阻塞 5 秒的进程,然后以线程安全的方式隐藏面板。

    或者,您可以使用 ScheduledExecutor,只要您确保使用 invokeLater() 在 EDT 上运行它。

    【讨论】:

      猜你喜欢
      • 2020-09-21
      • 2020-10-07
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 2023-04-04
      相关资源
      最近更新 更多