在Java程序中,会出现线程执行速度过快或者程序需要切换到另一个线程的情况。为此,您需要暂停当前线程的执行。在 Java 中,这可以使用java.lang.Thread.sleep()方法来完成。
Thread.sleep() 方法
Thread类存在于 Java.lang 包中并包含Thread.sleep()方法。 java.lang.thread sleep()方法用于将当前线程暂停指定的时间量(以毫秒为单位)。如果您查看Oracle 文档,您会发现Thread类有两个重载的sleep()方法。static void sleep(long millis)
其中 millis 是以毫秒为单位的时间。此方法导致当前正在执行的线程休眠(暂时停止执行,“休眠”)毫秒数,具体取决于系统计时器和调度程序的精度。毫秒的参数值不能为负数。如果是这样,将抛出 IllegalArgumentException 。
static void sleep(long millis, int nanos)
其中 mills 时间以毫秒为单位,nanos 是以纳秒为单位的时间。此方法的变体用于以毫秒和纳秒为单位的确切时间暂停当前线程的执行。纳秒值在 0 到 999999 之间有效。让我们创建一个简单的程序,使用Thread.sleep()方法暂停主线程的执行 5 秒:
public class SleepDemo {
public static void main(String[] args) throws InterruptedException {
//the current time in milliseconds
long start = System.currentTimeMillis();
// stop the main thread of the program for 5000 milliseconds (5 seconds)
Thread.sleep(5000);
System.out.println("The thread is paused for " + (System.currentTimeMillis() - start) + " milliseconds");
}
}
这个程序发生了什么?首先它启动,然后休眠 5 毫秒(5 秒),然后向控制台打印一条关于它被冻结了多长时间的消息,然后退出。输出是:
线程暂停 5008 毫秒
正如你所看到的,程序并没有暂停 5 秒,而是暂停了一点。此外,如果您在计算机上运行该程序,您会注意到它可能会停止线程的执行超过 5000 毫秒,而 5008 毫秒是不必要的。关键是这一切都取决于操作系统和线程调度程序的具体实现。更详细一点,线程在唤醒和开始执行之前等待的实际时间取决于系统计时器和调度程序。对于安静的系统,实际休眠时间接近于指定的休眠时间,但对于负载系统,它会稍微长一些。当你需要一直做一些动作,但不是太频繁时,这个方法经常用在子线程中。这是一个每秒打印一条消息并且永不退出的程序示例:
public class SleepDemo1 {
public static void main(String[] args) throws InterruptedException {
while (true)
{
Thread.sleep(1000);
System.out.println("One more second");
}
}
}
Java Thread Sleep的要点
请务必记住,Java Thread Sleep方法的工作方式如下:-
它总是暂停当前线程的执行。
-
实际线程会一直休眠直到被唤醒,执行时间取决于系统定时器和调度器。
-
休眠线程不会阻塞当前线程。
-
任何其他线程都可以中断当前休眠线程,在这种情况下会抛出InterruptedException 。
-
毫秒的参数值不能为负数,否则将抛出IllegalArgumentException 。
public class SleepDemo1 {
public static void main(String[] args) throws InterruptedException {
//the current time in milliseconds
long start = System.currentTimeMillis();
// stop the main thread of the program for 5000 milliseconds (5 seconds)
Thread.sleep(-5000);
System.out.println("The thread is paused for " + (System.currentTimeMillis() - start) + " ms");
}
}
这是输出:
线程“main”中的异常 java.lang.IllegalArgumentException:超时值在 java.base/java.lang.Thread.sleep(Native Method) 在 SleepDemo.main(SleepDemo.java:7)
上面我们让主线程进入睡眠状态。现在让我们尝试将该方法应用于其他线程。
// Java Program to sleep the custom thread
public class SleepDemo2 extends Thread{
public void run()
{
// thread 0
try {
for (int i = 0; i < 10; i++) {
// sleeps the main thread for about 2 seconds
Thread.sleep(2000);
System.out.println(i);
}
}
catch (Exception e) {
// catching the exception
System.out.println(e);
}
}
public static void main(String[] args)
{
SleepDemo2 sleepDemo2 = new SleepDemo2();
sleepDemo2.start();
}
}
输出是:
0 1 2 3 4 5 6 7 8 9