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


当前回答

使用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]);
        }
    }
}

其他回答

还有一种等待的方式。

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

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

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

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

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

TimeUtils.sleepFor(1, TimeUnit.SECONDS);

点击这里查看javadoc。您可以从Maven Central或Github访问库。关于图书馆的文章可以在这里找到

用这个:

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(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]);
        }
    }
}