如何在Java中进行延迟?

如何在Java中进行延迟?,java,wait,sleep,thread-sleep,Java,Wait,Sleep,Thread Sleep,我正在尝试用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++; } 我想构建一个step sequencer,我是Ja

我正在尝试用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++;
}

我想构建一个step sequencer,我是Java新手。有什么建议吗?

您需要使用
Thread.sleep()
调用

更多信息请点击这里:

使用
Thread.sleep(1000)

1000
是程序将暂停的毫秒数

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

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

TimeUnit.SECONDS.sleep(1);
睡一秒钟或几秒钟

TimeUnit.MINUTES.sleep(1);
睡一会儿

由于这是一个循环,因此存在一个固有的问题-漂移。每次你运行代码然后睡觉的时候,你都会有点偏离运行的方向,比如说,每秒钟。如果这是一个问题,那么不要使用
睡眠

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

对于每秒钟或每延迟一秒钟运行一个任务,我将强烈推荐一个和或

例如,要每秒运行方法
myTask
(Java 8):

在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");
}

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

TimeUtils.sleepFor(1, TimeUnit.SECONDS);
请参阅javadoc。您可以从或从访问库。关于该库的解释文章可以在

Use
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]);
        }
    }
}
公共类睡眠消息{
公共静态void main(字符串参数[])
抛出中断异常{
字符串重要性信息[]={
“母马吃燕麦”,
“他吃燕麦吗”,
“小羊羔吃常春藤”,
“孩子也会吃常春藤”
};
对于(int i=0;
i<重要信息长度;
(i++){
//暂停4秒钟
睡眠(4000);
//打印消息
系统输出打印LN(重要信息[i]);
}
}
}

我知道这是一篇非常古老的帖子,但这可能会帮助某些人: 您可以创建一个方法,因此无论何时需要暂停,都可以键入
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语句。

使用以下方法:

公共静态无效等待(int-ms)
{
尝试
{
睡眠(ms);
}
捕获(中断异常例外)
{
Thread.currentThread().interrupt();
}
}
然后,您可以在任何地方调用此方法,如:

wait(1000);

使用<代码>线程>睡眠()>代码>考虑使用等待的目的是什么?你是否在等待某件事的发生?确保你了解什么方法does@Tiny,它不安全。它实际上是
Thread.sleep()
s
不应该大写。别忘了记录InterruptedException,否则你永远不会知道这个线程被中断了。我很好奇线程.currentThread().interrupt()是什么;请看:“为什么我们必须再次中断线程?”这里:@Matthew Moisen我无法运行这个Java 8示例。App::到底是什么?通过将myTask()更改为可运行的lambda,它可以工作:可运行的myTask=()->{…};这是一个方法引用@comfytoday-我建议从.TimeUnit.SECONDS.wait(1)
开始在Windows 6.3上的Java 8.1 build 31中抛出
IllegalMonitorStateException
。相反,我可以使用
Thread.sleep(1000)
而不用try/catch。在Java 8中,在Java.util.concurrent.TimeUnit中,您会得到
未处理的异常:Java.lang.InterruptedExecution
对于
睡眠(1)
您必须围绕
TimeUnit.SECONDS.sleep(1)try catch
使用
catch(interruptedeexception e){/*empty*/}
在这里不是一个明智的解决方案。至少,您应该提供一些日志信息。有关主题的更多信息,请参阅@Marco13实际上由于您的评论和其他人的评论,我修改了TimeUtils.sleepFor()方法,现在它中断了当前线程。因此,它在某种程度上仍然很方便,您不需要捕获InterruptedException,但是中断机制现在可以工作了。
wait(1000);