java.lang.Thread run() 方法可以使当线程进入休眠状态,时间取决于你声明的毫秒时长。此参数不可以为负数,若传入负数,程序会抛出IllegalArgumentException异常。
还有另外一个方法可以使线程休眠达到毫微秒级别 -- sleep(long mills, int nanos)。毫微秒参数的范围在0 ~ 999999之间。
下面有段例子代码展示的是在执行Thread.sleep() 代码处会让main线程进行休眠状态并持续2秒钟。
ThreadSleep.java
package com.journaldev.threads;
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));
}
}
如果你尝试运行了上面的代码,你会发现打印出来的时间结果略微比2秒长点,造成此结果是因为线程休眠工作方式及操作系统具体执行程序的调度方式。
线程休眠的关键点
- 总会停止当前线程的运行。
- 线程从进入休眠状态到被唤醒中所花的时间取决于操作系统的统一调度。当操作系统处理任务较少的时候,这个时间会相对准确一些,而当操作系统任务多繁忙时,这个时间会花的相对多些。
- 线程在休眠状态时并不会丢失其获得监视器及线程锁。
- 任何其他线程如果打断进入休眠状态的线程,都会抛出一个InterruptedException异常。
线程休眠是如何工作的
Thread.sleep() 实际上是使线程从运行时状态转换为休眠状态,并且等待被唤醒,而唤醒时长取决你传入的时间值。一旦当等待时间结束,线程会从休眠状态转换为运行时状态,并且等待CPU在未来的某个时间点分配资源片区来执行。所以实际等待时间是由操作系统来决定的。