如何延迟Java?


342

我正在尝试用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还是陌生的。有什么建议么?


19
使用Thread.Sleep()
2014年

2
考虑使用计时器
PeterMmm 2014年

2
等待的目的是什么?您是否正在等待某个事件发生?确保您了解sleep()方法的作用
artdanil 2014年

@Tiny,这不安全。
Yousha Aleayoub

12
实际上是Thread.sleep(<milisecondsToSleep>)。本s不应该是大写。
本杰明

Answers:


676

如果要暂停,请使用java.util.concurrent.TimeUnit

TimeUnit.SECONDS.sleep(1);

睡一秒钟或

TimeUnit.MINUTES.sleep(1);

睡一分钟。

由于这是一个循环,因此存在一个固有的问题-漂移。每次您运行代码然后进入睡眠状态时,您运行的每一秒都会有点漂移。如果这是一个问题,请不要使用sleep

此外,sleep在控制方面不是很灵活。

为了每秒或每隔一秒延迟运行一次任务,我强烈建议您使用ScheduledExecutorService和或scheduleAtFixedRatescheduleWithFixedDelay

例如,要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");
}

1
@Matthew Moisen我无法运行此Java 8示例。什么是App ::完全是?通过将myTask()更改为可运行的lambda,它可以工作:Runnable myTask =()-> {...};
comfytoday

2
这是方法参考@comfytoday-我建议从文档开始。
蜘蛛鲍里斯(Boris the Spider)

TimeUnit.SECONDS.wait(1)IllegalMonitorStateException在Windows 6.3上抛出Java 8.1 build 31。相反,我Thread.sleep(1000)无需尝试/捕获就可以使用。
John Meyer

1
在Java 8中,在java.util.concurrent.TimeUnit中获得Unhandled exception: java.lang.InterruptedExecutionsleep(1)
Shai Alon,

1
你必须围绕着TimeUnit.SECONDS.sleep(1);try catch
酾阿龙

148

使用Thread.sleep(1000);

1000 是程序将暂停的毫秒数。

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

5
不要忘记记录InterruptedException,否则您将永远不会知道该线程被中断。
m0skit0

12
我很好奇Thread.currentThread()。interrupt(); 在这里做。
布伦特212年

1
请参见:“为什么我们必须再次中断线程?” 此处:javaspecialists.eu/archive/Issue056.html
特里斯坦(Tristan)


4

用这个:

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

那么您可以在任何地方调用此方法,例如:

        wait(1000);

3

使用TimeUnit.SECONDS.sleep(1);或是Thread.sleep(1000);可以接受的方式。在这两种情况下,您都必须抓住InterruptedException使代码笨拙的地方。有一个名为MgntUtils的开源Java库(由我编写),提供了已经在InterruptedException内部处理的实用程序。因此,您的代码将只包含一行:

TimeUtils.sleepFor(1, TimeUnit.SECONDS);

此处查看javadoc 。您可以从Maven CentralGithub访问库。可以在这里找到有关该库的文章


2
使用catch (InterruptedException e) { /* empty */ }不是在这里一个明智的解决办法。至少,您应该提供一些日志信息。有关此主题的更多信息,请参见javaspecialists.eu/archive/Issue056.html
Marco13,18年

3

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

1

我知道这是一篇很老的文章,但这可能对某人有帮助:您可以创建一个方法,因此每当需要暂停时,您都可以键入pause(1000)或任何其他毫秒值:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.