【问题标题】:How do i have java wait a second before executing the next line, without try/catch [duplicate]我如何让java在执行下一行之前等待一秒钟,而不使用try/catch [重复]
【发布时间】:2016-10-26 14:22:54
【问题描述】:

我想知道是否有办法做到这一点,而不会造成任何混乱或混乱。 另外,当我执行wait() 方法时,它会出现java.lang.IllegalMonitorStateException 错误。

【问题讨论】:

  • wait 可能不符合您的预期。无论如何,你需要Thread.sleep()。如果您不想弄乱那些 try-catch 的东西,只需将其放入实用程序方法中并命名为 saveSleep 或其他名称
  • 你能找到运气吗here
  • 在发布之前彻底搜索 Stack Overflow。

标签: java try-catch wait


【解决方案1】:

Thread.sleep() 方法可以做你想做的事。这是一种简单的方法,可以在给定的时间内停止执行(并不总是准确的)。根据Oracle docs

Thread.sleep 使当前线程暂停执行一段指定的时间。这是一种使处理器时间可用于应用程序的其他线程或可能在计算机系统上运行的其他应用程序的有效方法。

所以,调用它,使用,

Thread.sleep(1000);

这将休眠一秒钟,直到进一步执行。时间以毫秒或纳秒为单位。

由于操作系统及其配置的原因,此方法可能并不总是准确的。

【讨论】:

    【解决方案2】:

    再一次,Guava 是你的朋友:

    Uninterruptibles.sleepUninterruptibly(1,TimeUnit.SECONDS);
    

    这就是它的实现方式:

     public static void sleepUninterruptibly(long sleepFor, TimeUnit unit) {
        boolean interrupted = false;
        try {
          long remainingNanos = unit.toNanos(sleepFor);
          long end = System.nanoTime() + remainingNanos;
          while (true) {
            try {
              // TimeUnit.sleep() treats negative timeouts just like zero.
              NANOSECONDS.sleep(remainingNanos);
              return;
            } catch (InterruptedException e) {
              interrupted = true;
              remainingNanos = end - System.nanoTime();
            }
          }
        } finally {
          if (interrupted) {
            Thread.currentThread().interrupt();
          }
        }
      }
    

    br

    【讨论】:

      【解决方案3】:

      在 Java 中

      Thread.sleep(intervalInMills);
      TimeUnit.MILLISECONDS.sleep(intervalInMills);
      

      定时器

      new Timer().scheduleAtFixedRate(task, delay, period);
      

      使用执行器框架

      ScheduledExecutorService.scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
      

      有了弹簧,

      @Scheduled(fixedDelay = 1000)
      private void method() {
          // some code
      }
      

      您还可以通过initialDelay 安排cronfixedRate

      【讨论】:

        【解决方案4】:

        没有线程和try/catch:

        static void pause(){
            long Time0 = System.currentTimeMillis();
            long Time1;
            long runTime = 0;
            while (runTime < 1000) { // 1000 milliseconds or 1 second
                Time1 = System.currentTimeMillis();
                runTime = Time1 - Time0;
            }
        }
        

        更新:

        awilkinson 是对的,上面的方法是一个非常糟糕的 hack。顺便说一句,如果你只是想让一个准备使用的方法等待一秒钟或更长时间,即使它使用 try/catch,那么我会推荐这个:

        public static void pause(double seconds)
        {
            try {
                Thread.sleep((long) (seconds * 1000));
            } catch (InterruptedException e) {}
        }
        

        【讨论】:

        • 不应该使用这种方法,因为它会在整个等待时间内使用 CPU 周期不断地执行循环。
        猜你喜欢
        • 1970-01-01
        • 2012-12-23
        • 2010-11-13
        • 2022-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-05
        相关资源
        最近更新 更多