首页 > 编程笔记 > Java笔记 阅读:27

Java Thread类的sleep()方法(附带实例)

在 Java 程序中,如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,那么可以通过调用 Thread 类的静态方法 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

相关文章