Java多线程编程核心技术(第3版)
上QQ阅读APP看书,第一时间看更新

1.5 方法sleep(long millis)

sleep()方法的作用是在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行),这个“正在执行的线程”是指this.currentThread()返回的线程。

下面通过一个示例进行说明。创建t8项目,类MyThread1.java代码如下:


public class MyThread1 extends Thread {
@Override
public void run() {
    try {
        System.out.println("run threadName="
            + this.currentThread().getName() + " begin");
        Thread.sleep(2000);
        System.out.println("run threadName="
            + this.currentThread().getName() + " end");
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

如果调用sleep()方法所在的类是Thread.java,则执行代码:


Thread.sleep(3000);
this.sleep(3000);

效果是一样的。

如果调用sleep()方法所在的类不是Thread.java,则必须使用如下代码实现暂停功能:


Thread.sleep(3000);

因为类中没有提供sleep()方法,所以不能使用this.sleep(3000);的写法。

运行类Run1.java代码如下:


public class Run1 {
public static void main(String[] args) {
    MyThread1 mythread = new MyThread1();
    System.out.println("begin =" + System.currentTimeMillis());
    mythread.run();
    System.out.println("end   =" + System.currentTimeMillis());
}
}

图1-32 将main线程暂停2秒

直接调用run()方法,程序运行结果如图1-32所示。

继续实验,创建MyThread2.java代码如下:


public class MyThread2 extends Thread {
@Override
public void run() {
    try {
        System.out.println("run threadName="
            + this.currentThread().getName() + " begin ="
            + System.currentTimeMillis());
        Thread.sleep(2000);
        System.out.println("run threadName="
            + this.currentThread().getName() + " end   ="
            + System.currentTimeMillis());
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

创建Run2.java代码如下:


public class Run2 {
public static void main(String[] args) {
    MyThread2 mythread = new MyThread2();
    System.out.println("begin =" + System.currentTimeMillis());
    mythread.start();
    System.out.println("end   =" + System.currentTimeMillis());
}
}

使用start()方法启动线程,程序运行结果如图1-33所示。

图1-33 运行结果

由于main线程与MyThread2线程是异步执行的,所以首先输出的信息为begin和end,而MyThread2线程是后运行的,在最后两行间隔了2秒输出run begin和run end相关的信息。