如何在 Java 中进行延迟?

问题描述 投票:0回答:8

我正在尝试用 Java 做一些事情,我需要在 while 循环中等待/延迟几秒。

while (true) {
    if (i == 3) {
        i = 0;
    }

    ceva[i].setSelected(true);

    // I need to wait here

    ceva[i].setSelected(false);

    // I need to wait here

    i++;
}

我想构建一个步进音序器。

如何在 Java 中进行延迟?

java wait sleep thread-sleep
8个回答
1116
投票

如果您想暂停,请使用

java.util.concurrent.TimeUnit
:

TimeUnit.SECONDS.sleep(1);

睡一秒钟或

TimeUnit.MINUTES.sleep(1);

睡一分钟。

由于这是一个循环,这就带来了一个固有的问题——漂移。每次你运行代码然后睡觉时,你都会偏离运行一点点,比如说,每一秒。如果这是一个问题,请不要使用

sleep

此外,

sleep
在控制方面也不是很灵活。

对于每秒或延迟一秒运行任务,我会强烈推荐

ScheduledExecutorService
以及
scheduleAtFixedRate
scheduleWithFixedDelay

例如,每秒运行一次方法

myTask
(Java 8):

public static void main(String[] args) {
    final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    executorService.scheduleAtFixedRate(App::myTask, 0, 1, TimeUnit.SECONDS);
}

private static void myTask() {
    System.out.println("Running");
}

在 Java 7 中:

public static void main(String[] args) {
    final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
    executorService.scheduleAtFixedRate(new Runnable() {
        @Override
        public void run() {
            myTask();
        }
    }, 0, 1, TimeUnit.SECONDS);
}

private static void myTask() {
    System.out.println("Running");
}

224
投票

使用

Thread.sleep(1000)
;

1000
是程序暂停的毫秒数。

try {
  Thread.sleep(1000);
} catch (InterruptedException e) {
  Thread.currentThread().interrupt();
}

32
投票

使用这个:

public static void wait(int ms)
{
    try
    {
        Thread.sleep(ms);
    }
    catch(InterruptedException ex)
    {
        Thread.currentThread().interrupt();
    }
}

然后你可以在任何地方调用这个方法,例如:

wait(1000);

11
投票

您需要使用

Thread.sleep()
电话。

更多信息请参见:https://docs.oracle.com/javase/tutorial/essential/concurrency/sleep.html


7
投票

使用

Thread.sleep(100);
。 时间单位是毫秒

例如:

public class SleepMessages {
    public static void main(String args[])
        throws InterruptedException {
        String importantInfo[] = {
            "Mares eat oats",
            "Does eat oats",
            "Little lambs eat ivy",
            "A kid will eat ivy too"
        };

        for (int i = 0;
             i < importantInfo.length;
             i++) {
            //Pause for 4 seconds
            Thread.sleep(4000);
            //Print a message
            System.out.println(importantInfo[i]);
        }
    }
}

5
投票

使用

TimeUnit.SECONDS.sleep(1);
Thread.sleep(1000);
是可以接受的方式。在这两种情况下,你都必须捕获
InterruptedException
,这会使你的代码变得庞大。有一个名为 MgntUtils (由我编写)的开源 java 库,它提供了已经在内部处理
InterruptedException
的实用程序。所以你的代码只包含一行:

TimeUtils.sleepFor(1, TimeUnit.SECONDS);

请参阅 javadoc 此处。您可以从 Maven Central 或从 Github 访问库。有关该库的解释文章可以在here

找到

3
投票

还有一种等待方式。

您可以使用 LockSupport 方法,例如:

LockSupport.parkNanos(1_000_000_000); // Disables current thread for scheduling at most for 1 second

幸运的是,他们不会抛出任何已检查的异常。但另一方面,根据文档,启用线程还有更多原因:

  • 其他一些线程以当前线程为目标调用 unpark
  • 其他线程中断当前线程

2
投票

我知道这是一篇非常旧的帖子,但这可能会对某人有所帮助: 您可以创建一个方法,因此每当需要暂停时,您可以键入

pause(1000)
或任何其他毫秒值:

public static void pause(int ms) {
    try {
        Thread.sleep(ms);
    } catch (InterruptedException e) {
        System.err.format("InterruptedException : %s%n", e);
    }
}

它插入到类内部的

public static void main(String[] args)
上方。然后,要调用该方法,请键入
pause(ms)
,但将
ms
替换为要暂停的毫秒数。这样,您就不必在想要暂停时插入整个 try-catch 语句。

© www.soinside.com 2019 - 2024. All rights reserved.