如何在Java中进行延迟?
我正在尝试用Java做一些事情,我需要在while循环中等待/延迟几秒钟如何在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
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。您可以从或从访问库。关于该库的解释文章可以在UseThread.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);