【问题标题】:Making thread.sleep() stops the previous code [duplicate]使 thread.sleep() 停止前面的代码[重复]
【发布时间】:2016-12-12 21:43:06
【问题描述】:

我想在活动结束后暂停一下。但是当我使用 Thread.Sleep(1000) 时,它也会停止上面的代码。例如:

attackButton.setOnAction(e -> {
        int playerAttack = player.getAtt();
        mob.setHP(playerAttack);
        mobHPLabel.setText(mob.getHP() + " HP");
        eventTextArea.appendText("You dealt " + playerAttack + " damage to the " + mob.getEntityClass() + "\n");
        Layout.setTextAreaFont(eventTextArea, "black", 15);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
        mobTurn();
    });

这只是我代码的一小部分,但问题就在这里。 “Thread.sleep(1000)”不仅延迟了它应该做的“mobTurn()”。它也停止了上面的代码,“event.TextArea.appendText(...”

【问题讨论】:

  • 我想您实际上暂停了 UI 线程,该线程负责在您的操作处理程序完成之后 使附加文本可见。因此,您永远不应暂停此线程。您可以启动另一个等待 1000 秒并执行 mobTurn() 然后的线程。
  • 我建议遵循 Tomas Mikula 在 dup 问题中的回答。使用动画 API 可避免使用与后台线程关联的资源。
  • 您可能希望在 mobTurn 完成之前禁用攻击按钮,否则玩家可以在暴徒有机会转弯之前将攻击按钮捣碎,这似乎不太公平:-)
  • PauseTransition 代替mobTurn() 的睡眠呼叫也可以在这里工作。

标签: java javafx


【解决方案1】:

通过在事件处理程序中调用Thread.sleep(..),您实际上暂停了您的核心 UI 线程。这就是为什么不仅mobTurn() 被延迟,而且你的完整 UI 也被延迟了。这包括您的界面的无效和绘制,以及其他事件的处理。在那个时候,您会认为您的应用程序“冻结”或“没有响应”。

相反,您应该启动另一个线程,该线程依次等待并在时机成熟时执行您想要的操作。您可以为此使用Platform.runLater(..)。示例见this answer

【讨论】:

    猜你喜欢
    • 2012-12-15
    • 1970-01-01
    • 2013-02-01
    • 2020-06-14
    • 2012-06-04
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多