学科分类
目录
Java基础

线程休眠

在前面过线程的优先级,优先级高的线程有更大的概率优先执行,而优先级低的线程可能会后执行。如果想要人为地控制线程执行顺序,使正在执行的线程暂停,将CPU使用权让给其他线程,这时可以使用静态方法sleep(long millis),该方法可以让当前正在执行的线程暂停一段时间,进入休眠等待状态,这样其他的线程就可以得到执行的机会。sleep(long millis)方法会声明抛出InterruptedException异常,因此在调用该方法时应该捕获异常,或者声明抛出该异常。

接下来通过案例演示一下sleep()方法在程序中的使用,如文件1所示。

文件1 Example08.java

 1    public class Example08 {
 2        public static void main(String[] args) {
 3            // 分别定义两个Thread线程对象
 4            Thread thread1 = new Thread(() -> {
 5                for (int i = 0; i < 10; i++) {
 6                    System.out.println(Thread.currentThread().getName()
 7                                         + "正在输出i:" + i);
 8                    if(i ==2){
 9                        try {
 10                            // 在该线程执行过程中进入睡眠状态,让其他线程先执行
 11                            Thread.sleep(500);
 12                        } catch (InterruptedException e) {
 13                            e.printStackTrace();
 14                        }
 15                    }
 16                }
 17            });
 18            Thread thread2 = new Thread(() -> {
 19                for (int j = 0; j < 10; j++) {
 20                    System.out.println(Thread.currentThread().getName()
 21                                         + "正在输出j:" + j);
 22                }
 23            });
 24            // 开启两个线程 
 25            thread1.start();
 26            thread2.start();
 27        }
 28    }

运行结果如图1所示。

图1 运行结果

文件1中开启了两个线程,同时在thread1线程执行过程中调用了Thread的sleep(500)方法,目的是让一个线程在执行的某一时刻休眠500毫秒,从而使另一个线程获得执行的机会。正常情况下,这两个线程会争相获取CUP执行权并交互打印输出信息。

从图1可以看出,当thread1执行到i==2时,就会进入休眠状态,此时可以看到thread2线程一直会获得CUP使用权,直到thread1线程休眠时间消耗完成才有机会获得CUP使用权。

需要注意的是,线程类Thread提供了两个线程休眠方法:sleep(long millis)和sleep(long millis, int nanos),这两个方法都带有休眠时间参数,当其他线程都终止后并不代表当前休眠的线程会立即执行,而是必须当休眠时间结束后,线程才会转换到就绪状态。

点击此处
隐藏目录