【问题标题】:How to pause my Java program for 2 seconds如何暂停我的 Java 程序 2 秒
【发布时间】:2023-03-11 09:01:01
【问题描述】:

我是 Java 新手,正在制作一个用于练习的小游戏。

if (doAllFaceUpCardsMatch == false) {
        //run pause here//
        concentration.flipAllCardsFaceDown();
} else {
        concentration.makeAllFaceUpCardsInvisible();
}

我想在这里暂停游戏两秒钟

concentration.flipAllCardsFaceDown();

我将如何暂停它?

【问题讨论】:

  • How to delay in Java?的可能重复
  • Thread.sleep 将是显而易见的选择,但是,如果您使用的是 Swing 或 JavaFX 之类的 GUI,您不应该在它们的调度线程的上下文中执行此操作,那将是真的, 特别糟糕。大多数 UI 框架都有自己定义的机制来执行此操作,但我们没有这些信息
  • 当我执行 Thread.sleep() 时,我得到:“错误:未报告的异常 InterruptedException;必须被捕获或声明为抛出 Thread.sleep(2000);”编译时
  • @Ethanph89 好吧,编译器准确地告诉你你必须做什么:捕捉InterruptedException,或者声明它被抛出。
  • 顺便说一下,不要明确比较truefalse

标签: java timer pause


【解决方案1】:

您可以在这里找到类似的帖子:How to delay in Java?

基本上是旧帖子中所说的。你可以使用 java.util.concurrent.TimeUnit

    import java.util.concurrent.TimeUnit;

    if (doAllFaceUpCardsMatch == false) {
        TimeUnit.SECONDS.sleep(2);
        concentration.flipAllCardsFaceDown();
    } else {
        concentration.makeAllFaceUpCardsInvisible();
    }

【讨论】:

    【解决方案2】:

    你可以使用:

     Thread.sleep(2000);
    

    java.util.concurrent.TimeUnit.SECONDS.sleep(2);
    

    请注意,这两个方法都会抛出InterruptedException,这是一个已检查的异常,因此您必须捕获它或在方法中声明。

    编辑: 捕获异常后,您的代码将如下所示:

    if (doAllFaceUpCardsMatch == false) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            concentration.flipAllCardsFaceDown();
    } else {
            concentration.makeAllFaceUpCardsInvisible();
    }
    

    由于您是新手,我建议您在熟悉 java 后学习如何进行异常处理。

    【讨论】:

    • 感谢您的帮助!就像我说的,我是 Java 新手(以及大多数编程方面的新手)——我将如何捕获异常?
    【解决方案3】:

    您可以使用 Thread.currentThread().sleep(2000) 将当前线程暂停 2 秒(2000 毫秒)。如果是 InterruptedExceptions,你应该用 try/catch 包围它。

    【讨论】:

      【解决方案4】:

      对于那些只想快速破解而无需引入图书馆的人...

      public class Timing {
          public static void main(String[] args) {
                  int delay = 1000; // number of milliseconds to sleep
      
                  long start = System.currentTimeMillis();
                  while(start >= System.currentTimeMillis() - delay); // do nothing
      
                  System.out.println("Time Slept: " + Long.toString(System.currentTimeMillis() - start));
          }
      }
      

      对于高精度 60fps 游戏,这可能不是您想要的,但也许有些人会觉得它很有用。

      【讨论】:

      • 这有一个浪费的高 CPU 使用率。
      • 这是我需要的。流行的 Swing Timer 方法不起作用,因为主线程在 Timer 执行时继续运行。
      【解决方案5】:

      另一种非常简单的方法是创建以下方法:

      public static void pause(long timeInMilliSeconds) {
      
          long timestamp = System.currentTimeMillis();
      
      
          do {
      
          } while (System.currentTimeMillis() < timestamp + timeInMilliSeconds);
      
      }
      

      【讨论】:

      • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。
      • 我想任何知道方法是什么以及如何调用它的人都可以。如果不知道,这个不应该在这里复制和粘贴代码,而是在做一些基本的 Java 课程。伸出援助之手和束缚灵魂之间有一条直线。
      猜你喜欢
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      相关资源
      最近更新 更多