我正在尝试用 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 中进行延迟?
如果您想暂停,请使用
java.util.concurrent.TimeUnit
:
TimeUnit.SECONDS.sleep(1);
睡一秒钟或
TimeUnit.MINUTES.sleep(1);
睡一分钟。
由于这是一个循环,这就带来了一个固有的问题——漂移。每次你运行代码然后睡觉时,你都会偏离运行一点点,比如说,每一秒。如果这是一个问题,请不要使用
sleep
。
此外,
sleep
在控制方面也不是很灵活。
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();
}
使用这个:
public static void wait(int ms)
{
try
{
Thread.sleep(ms);
}
catch(InterruptedException ex)
{
Thread.currentThread().interrupt();
}
}
然后你可以在任何地方调用这个方法,例如:
wait(1000);
您需要使用
Thread.sleep()
电话。
更多信息请参见:https://docs.oracle.com/javase/tutorial/essential/concurrency/sleep.html
使用
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]);
}
}
}
使用
TimeUnit.SECONDS.sleep(1);
或 Thread.sleep(1000);
是可以接受的方式。在这两种情况下,你都必须捕获 InterruptedException
,这会使你的代码变得庞大。有一个名为 MgntUtils (由我编写)的开源 java 库,它提供了已经在内部处理 InterruptedException
的实用程序。所以你的代码只包含一行:
TimeUtils.sleepFor(1, TimeUnit.SECONDS);
请参阅 javadoc 此处。您可以从 Maven Central 或从 Github 访问库。有关该库的解释文章可以在here
找到还有一种等待方式。
您可以使用 LockSupport 方法,例如:
LockSupport.parkNanos(1_000_000_000); // Disables current thread for scheduling at most for 1 second
幸运的是,他们不会抛出任何已检查的异常。但另一方面,根据文档,启用线程还有更多原因:
我知道这是一篇非常旧的帖子,但这可能会对某人有所帮助: 您可以创建一个方法,因此每当需要暂停时,您可以键入
pause(1000)
或任何其他毫秒值:
public static void pause(int ms) {
try {
Thread.sleep(ms);
} catch (InterruptedException e) {
System.err.format("InterruptedException : %s%n", e);
}
}
它插入到类内部的
public static void main(String[] args)
上方。然后,要调用该方法,请键入 pause(ms)
,但将 ms
替换为要暂停的毫秒数。这样,您就不必在想要暂停时插入整个 try-catch 语句。