16.4.3 线程睡眠sleep

16.4.3 线程睡眠sleep

sleep方法

如果需要让当前正在执行的线程暂停一段时间,并进入阻塞状态,则可以通过调用Thread类的静态sleep方法来实现。
这里有一张图片

sleep方法有如下两种重载形式

方法 描述
static void sleep(long millis) 让当前正在执行的线程暂停millis毫秒,并进入阻塞状态,该方法受到系统计时器和线程调度器的精度与准确度的影响。
static void sleep(long millis, int nanos) 让当前正在执行的线程暂停 millis毫秒加 nanos毫微秒,并进入阻塞状态,该方法受到系统计时器和线程调度器的精度与准确度的影响。一般很少调用这种形式的sleep方法。

当一个线程调用sleep方法进入阻塞状态后,在其睡眠时间段内,该线程不会获得执行的机会,即使系统中没有其他可执行的线程,处于sleep()中的线程也不会执行,因此sleep方法常用来暂停程序的执行。

程序示例 线程sleep

下面程序调用sleep方法来暂停主线程的执行,因为该程序只有一个主线程,当主线程进入睡眠后,系统没有可执行的线程,所以可以看到程序在sleep方法处暂停。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.*;

public class SleepTest
{
public static void main(String[] args)
throws Exception
{
for (int i = 0; i < 10 ; i++ )
{
System.out.println("当前时间: " + new Date());
// 调用sleep方法让当前线程暂停1s。
Thread.sleep(1000);
}
}
}

运行效果

1
2
3
4
5
6
7
8
9
10
当前时间: Wed Jul 17 13:21:24 CST 2019
当前时间: Wed Jul 17 13:21:25 CST 2019
当前时间: Wed Jul 17 13:21:26 CST 2019
当前时间: Wed Jul 17 13:21:27 CST 2019
当前时间: Wed Jul 17 13:21:28 CST 2019
当前时间: Wed Jul 17 13:21:29 CST 2019
当前时间: Wed Jul 17 13:21:30 CST 2019
当前时间: Wed Jul 17 13:21:31 CST 2019
当前时间: Wed Jul 17 13:21:32 CST 2019
当前时间: Wed Jul 17 13:21:33 CST 2019

运行上面程序,看到程序依次输出10条字符串,输出2条字符串之间的时间间隔为1秒。