在前面已经讲过线程的优先级,优先级高的程序会先执行,而优先级低的程序会后执行。如果希望人为地控制线程,使正在执行的线程暂停,将 CPU 让给别的线程,这时可以使用静态方法 sleep(long millis)方法,该方法可以让当前正在执行的线程暂停一段时间,进入休眠等待状态。当前线程调用 sleep(long millis)方法后,在指定的时间(参数 millis)内该线程使不会执行的,这样其他的线程就可以得到执行的机会了

    sleep(long millis)方法声明会抛出 InterruptedException 异常,因此在调用该方法时应该捕获异常,或者声明抛出该异常。接下来通过一个案例来演示一下 sleep(long millis)方法在程序中的使用,如下所示。

    1. public class example07 {
    2. public static void main(String[] args) throws Exception {
    3. //创建一个线程
    4. new Thread(new Task()).start();
    5. for (int i = 1; i <= 10; i++) {
    6. if (i == 5) {
    7. Thread.sleep(2000); //当前 main 主线程休眠 2 秒
    8. }else {
    9. Thread.sleep(500);
    10. }
    11. System.out.println("main 主线程正在输出:" + i);
    12. }
    13. }
    14. }
    15. //定义线程的任务类
    16. class Task implements Runnable{
    17. @Override
    18. public void run() {
    19. for (int i = 1; i <= 10; i++) {
    20. try {
    21. if (i == 3) {
    22. Thread.sleep(2000); //当前线程休眠 2 秒
    23. }else {
    24. Thread.sleep(500);
    25. }
    26. System.out.println("线程一正在输出:" + i);
    27. } catch (Exception e) {
    28. e.printStackTrace();
    29. }
    30. }
    31. }
    32. }

    运行结果如下所示。
    QQ截图20200709135058.png
    在上述代码块中,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()方法是静态方法,只能控制**当前正在运行的线程**休眠,而不能控制其他线程休眠当休眠时间结束后,线程就会返回到**就绪状态**,而不是立刻开始运行。