Java Thread类的sleep()方法(附带实例)
在 Java 程序中,如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,那么可以通过调用 Thread 类的静态方法 sleep() 来实现。
sleep()方法的作用是使当前调用该方法的线程进入阻塞状态。sleep()方法有两种重载形式:
在使用 sleep() 方法阻塞线程时,线程在阻塞了指定的时长后,并不一定马上恢复执行,这是因为在 Windows 环境下进程调度是抢占式的。一个线程处于运行状态时调用 sleep() 方法,就会进入等待状态,睡眠结束以后,并不是直接回到运行状态,而是进入就绪队列,要等到其他线程放弃时间片后才能重新进入运行状态。
所以,
当线程调用 sleep() 方法进入阻塞状态后,在其睡眠时间段内,该线程不会获得执行的机会,即使系统中没有其他可执行的线程,使用 sleep() 方法的线程也不会执行。因此,sleep() 方法常用来暂停程序的执行。
【实例】sleep()方法的应用。
sleep()方法的作用是使当前调用该方法的线程进入阻塞状态。sleep()方法有两种重载形式:
static Thread sleep(long millis); // ①暂停当前线程的执行,暂停时间由方法参数指定,单位为毫秒。需要注意的是,参数不能为负数,否则程序将抛出 IllegalArgumentException 异常。
static Thread sleep(long millis,int nanos); // ②暂停当前线程的执行,暂停时间为 millis 毫秒加 nanos 纳秒。纳秒允许的取值范围为 0~999999。
在使用 sleep() 方法阻塞线程时,线程在阻塞了指定的时长后,并不一定马上恢复执行,这是因为在 Windows 环境下进程调度是抢占式的。一个线程处于运行状态时调用 sleep() 方法,就会进入等待状态,睡眠结束以后,并不是直接回到运行状态,而是进入就绪队列,要等到其他线程放弃时间片后才能重新进入运行状态。
所以,
sleep(1000)
表示在 1000 毫秒以后,线程不一定会被唤醒。sleep(0)
可以看成一个运行状态的进程产生一个中断,由运行状态直接转入就绪状态。使用 sleep() 方法可以为其他处于就绪状态的线程提供使用时间片的机会。当线程调用 sleep() 方法进入阻塞状态后,在其睡眠时间段内,该线程不会获得执行的机会,即使系统中没有其他可执行的线程,使用 sleep() 方法的线程也不会执行。因此,sleep() 方法常用来暂停程序的执行。
【实例】sleep()方法的应用。
public class Example { public static void main(String[] args) { Thread t1 = new Thread(new MyRunner3()); System.out.println("主线程开始时间 = "+System.currentTimeMillis()); t1.start(); System.out.println("主线程结束时间 = "+System.currentTimeMillis()); } } class MyRunner3 implements Runnable{ @Override public void run() { try{ System.out.println("正在运行的线程名称: "+ Thread.currentThread().getName()+ " 开始时间 = "+System.currentTimeMillis()); // 延时 2 秒 Thread.sleep(2000); System.out.println("正在运行的线程名称: "+ Thread.currentThread().getName()+ " 结束时间 = "+System.currentTimeMillis()); }catch(InterruptedException e) { e.printStackTrace(); } } }运行结果为:
主线程开始时间=1657032627449
主线程结束时间=1657032627450
正在运行的线程名称: Thread-0 开始时间=1657032627450
正在运行的线程名称: Thread-0 结束时间=1657032629453