2.4 线程的休眠

2016-05-31 21:45:15 4,749 0

线程对象一旦调用其start方法之后,就会运行,运行的就是run方法中的代码,等到run方法中的代码运行结束,线程就执行完成。

如果我们想在线程运行的时候,让其暂停一会,可以调用线程sleep方法,sleep方法的作用是让线程进行休眠,意思是线程暂停执行。在执行的休眠时间内,该线程是不会请求CPU进行执行,因此其他线程可以获得更多的运行机会。

暂停是有实际的作用的,例如我们想检查远程服务器的运行状态,为了可以一直进行检查,我们可能会将检查服务器运行状况的代码放在一个死循环中。但是频繁的发送请求可能又会给服务器造成压力,因此我们可能是希望每隔几秒中去检查一次,这实际上就是一个简易定时器的作用(在Java中,定时器有一个专门的类叫做Timer)。

以下代码用于演示线程的休眠:

public class SleepDemo {
    public static void main(String[] args) {
        new Thread(){
            @Override
            public void run() {
                //我们希望不断的去检查服务器的状态,所以讲将检查的代码放入一个死循环中
                while (true){
                    //用打印一句话表示检查服务器状态
                    System.out.println("检查服务器状态....当前时间:"+new Date().toLocaleString());
                    try {
                        //休眠3秒,以免检查台频繁
                        this.sleep(3000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }
}

以上程序的运行结果:

检查服务器状态....当前时间:2016-5-31 21:36:28

检查服务器状态....当前时间:2016-5-31 21:36:31

检查服务器状态....当前时间:2016-5-31 21:36:34

检查服务器状态....当前时间:2016-5-31 21:36:37

....

可以看到的确是每隔3秒执行一次!

注意sleep方法抛出了一个InterruptedException异常。这个异常是在线程还在休眠的时候,如果其他的线程中断(interrupt)了这个线程的执行抛出的。中断的作用是,如果一个线程在运行期,我们不想其继续运行下去了,就可以给其发送一个信号,让其停止运行。注意中断和休眠的区别,中断是让线程停止运行,而休眠只是暂停运行,等到休眠时间过后,可以继续执行。在下一节我们会详细的讲解中断相关的知识。