java.lang.Thread的sleep()方法能使当前线程暂停运行一段时间(单位毫秒)。需要注意的是,sleep()方法的参数不能为负,否则会抛出IllegalArgumentException异常。
除此之外,还有另一个方法sleep(long millis, int nanos),该方法可用于使当前线程暂停millis毫秒nanos纳秒。需要注意的是,参数nanos的取值范围为[0, 999999]。
下面的代码演示如何用Thread.sleep()方法令主线程暂停执行2秒。
ThreadSleep.java
package com.journaldev.threads;如果你运行上述程序,你会发现最后打印出来的结果会比2000略多一些,这取决于线程休眠是如何实现的,以及操作系统定义的线程调度机制。
public class ThreadSleep {
public static void main(String[] args) throws InterruptedException {
long start = System.currentTimeMillis();
Thread.sleep(2000);
System.out.println("Sleep time in ms = " + (System.currentTimeMillis()-start));
}
}
线程休眠要点
1. 线程休眠总是暂停当前线程
2. 在被唤醒并开始执行前,线程休眠的实际时间取决于系统计时器和调度器。对比较清闲的系统来说,实际休眠的时间十分接近于指定的休眠时间,但对于繁忙的系统,两者之间的差距就较大。
3. 线程休眠并不会丢失当前线程已获取的任何监视器和锁。
4. 其他线程可以中断当前进程的休眠,但会抛出InterruptedException异常。
线程休眠的工作原理
Thread.sleep()与线程调度器交互,它将当前线程设置为等待一段时间的状态。一旦等待时间结束,线程状态就会被改为可运行(runnable),并开始等待CPU来执行后续的任务。因此,当前线程的实际休眠时间取决于线程调度器,而线程调度器则是由操作系统来进行管理的。