如果希望人为地控制线程,使正在执行的线程暂停,将 CPU 让给别的线程,这时可以使用静态方法 sleep ( long millis ),该方法可以让当前正在执行的线程暂停一段时间,进人休眠等待状态。sleep ( long millis )方法声明抛出InterruptedException 异常,因此在调用该方法时应该捕获异常,或者声明抛出该异常

案例 ExampleM08:

public class ExampleM08 {
    public static void main(String[] args) throws Exception{
        //创建一个线程
        new Thread(new SleepThread()).start();
        for (int i=1;i<=10;i++) {
            if (i==5) {
                Thread.sleep(2000); //当前线程休眠 2秒
            }
            System.out.println("主线程正在输出:"+i);
            Thread.sleep(500);  //当前线程休眠 500毫秒
        }

    }
}
//定义 SleepThread类实现 Runnable接口
class SleepThread implements Runnable {
    public void run() {
        for (int i=1;i<=10;i++) {
            if (i==3) {
                try {
                    Thread.sleep(2000); //当前线程休眠 2秒
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("线程一正在输出:"+i);
            try {
                Thread.sleep(500);  //当前线程休眠 500毫秒
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

线程一for 循环中,当i=3时,调用了 Thread 的 sleep (2000)方法(代码的第20行左右),使线程休眠2s。从运行结果可以看出,主线程输出2后,线程一没有交替输出3,而是主线程接着输出了3和4,这说明了线程一进人了休眠等待状态。

主线程for 循环中,当i=5时,也调用了 Thread 的 sleep (2000)方法(代码的第7行左右),使线程休眠2s。从运行结果可以看出,在主线程输出4后,下面连续4句话都是线程一输出的。只有当主线程2s休眠完毕后,两个线程才会恢复交替执行。

需要注意的是,sleep()是静态方法,只能控制当前正在运行的线程休眠,而不能控制其他程序休眠。当休眠时间结束后,线程就会返回到就绪状态,而不是立即开始运行。