我试图在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中进行延迟?


当前回答

还有一种等待的方式。

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

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

幸运的是,它们不会抛出任何受控异常。但另一方面,根据文档,有更多的理由启用线程:

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

其他回答

我知道这是一个非常老的帖子,但这可能会帮助到一些人: 你可以创建一个方法,所以当你需要暂停时,你可以输入pause(1000)或任何其他毫秒值:

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

它被插入到类内部的公共静态void main(String[] args)之上。然后,要调用该方法,键入pause(ms),但将ms替换为要暂停的毫秒数。这样,就不必在需要暂停时插入整个try-catch语句。

用这个:

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

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

wait(1000);

如果你想暂停,那么使用java.util.concurrent.TimeUnit:

TimeUnit.SECONDS.sleep(1);

睡一秒钟或

TimeUnit.MINUTES.sleep(1);

睡一分钟。

由于这是一个循环,这就提出了一个固有的问题-漂移。每次你运行代码然后睡觉的时候,你都会从运行中飘忽不定,比如说,每一秒。如果这是一个问题,那么不要使用睡眠。

此外,当涉及到控制时,睡眠不是很灵活。

对于每秒钟或一秒延迟运行一个任务,我强烈推荐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");
}

使用thread . sleep (1000);

1000是程序暂停的毫秒数。

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

你需要使用Thread.sleep()调用。

更多信息请访问:http://docs.oracle.com/javase/tutorial/essential/concurrency/sleep.html