我试图在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()调用。
Thread.sleep()
更多信息在这里:http://docs.oracle.com/javase/tutorial/essential/concurrency/sleep.html
使用# EYZ0;
1000是程序暂停的毫秒数。
1000
try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); }
如果你想暂停,那么使用java.util.concurrent.TimeUnit:
java.util.concurrent.TimeUnit
TimeUnit.SECONDS.sleep(1);
睡一秒钟或
TimeUnit.MINUTES.sleep(1);
睡一分钟。
由于这是一个循环,这就提出了一个固有的问题-漂移。每次你运行代码然后睡觉的时候,你都会从运行中飘忽不定,比如说,每一秒。如果这是一个问题,那么不要使用sleep。
sleep
此外,sleep在控制方面不是很灵活。
对于每秒运行一个任务或延迟一秒的任务,我会推荐强烈和scheduleAtFixedRate或scheduleWithFixedDelay。
scheduleAtFixedRate
scheduleWithFixedDelay
例如,每秒运行方法myTask (Java 8):
myTask
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"); }
使用TimeUnit.SECONDS.sleep(1);或Thread.sleep(1000);是可以接受的方式。在这两种情况下,你都必须捕获# eyz2,这会使你的代码变得笨重。有一个名为MgntUtils的开源java库(由我编写),它提供了已经处理InterruptedException的实用程序。所以你的代码只包含一行:
Thread.sleep(1000);
InterruptedException
TimeUtils.sleepFor(1, TimeUnit.SECONDS);
参见javadoc# EYZ0。您可以从Maven中央或Github访问库。解释这个库的文章可以在在这里找到
例如:
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]); } } }
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语句。
public static void main(String[] args)
pause(ms)
ms
用这个:
public static void wait(int ms) { try { Thread.sleep(ms); } catch(InterruptedException ex) { Thread.currentThread().interrupt(); } }
然后,你可以在任何地方调用这个方法,比如:
wait(1000);
还有一种等待的方式。
你可以使用LockSupport方法,例如:
LockSupport.parkNanos(1_000_000_000); // Disables current thread for scheduling at most for 1 second
幸运的是,它们不会抛出任何受控异常。但另一方面,根据文档,有更多的理由启用线程: