在前面已经讲过线程的优先级,优先级高的程序会先执行,而优先级低的程序会后执行。如果希望人为地控制线程,使正在执行的线程暂停,将 CPU 让给别的线程,这时可以使用静态方法 sleep(long millis)方法,该方法可以让当前正在执行的线程暂停一段时间,进入休眠等待状态。当前线程调用 sleep(long millis)方法后,在指定的时间(参数 millis)内该线程使不会执行的,这样其他的线程就可以得到执行的机会了。
sleep(long millis)方法声明会抛出 InterruptedException 异常,因此在调用该方法时应该捕获异常,或者声明抛出该异常。接下来通过一个案例来演示一下 sleep(long millis)方法在程序中的使用,如下所示。
public class example07 {
public static void main(String[] args) throws Exception {
//创建一个线程
new Thread(new Task()).start();
for (int i = 1; i <= 10; i++) {
if (i == 5) {
Thread.sleep(2000); //当前 main 主线程休眠 2 秒
}else {
Thread.sleep(500);
}
System.out.println("main 主线程正在输出:" + i);
}
}
}
//定义线程的任务类
class Task implements Runnable{
@Override
public void run() {
for (int i = 1; i <= 10; i++) {
try {
if (i == 3) {
Thread.sleep(2000); //当前线程休眠 2 秒
}else {
Thread.sleep(500);
}
System.out.println("线程一正在输出:" + i);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
运行结果如下所示。
在上述代码块中,main 方法和 Task 类的 run()方法中,分别定义了一个 for()循环来输出 1 到 10,其中 mian()方法代表主线程,而 Task 类时线程一的任务类。在主线程的 for()循环方法中,当 i==5 时,会执行 Thread.sleep(2000)方法,使**当前线程**休眠 2 秒,否则执行 Thread.sleep(500),使当前线程休眠 500 毫秒,在休眠过程中,线程一**会获得执行机会。在开启的新线程(线程一)中,当 i==3 时,会执行 Thread.sleep(2000)方法,使当前线程休眠 2 秒,否则执行 Thread.sleep(500),使当前线程休眠 500 毫秒,同样,在休眠过程中,主线程**会获得执行机会。这样,在运行程序的时候,就出现了如上图所示的 main 主线程和线程一交替执行输出的情况。
需要注意的是,sleep()方法是静态方法,只能控制**当前正在运行的线程**休眠,而不能控制其他线程休眠。当休眠时间结束后,线程就会返回到**就绪状态**,而不是立刻开始运行。