线程休眠
在前面过线程的优先级,优先级高的线程有更大的概率优先执行,而优先级低的线程可能会后执行。如果想要人为地控制线程执行顺序,使正在执行的线程暂停,将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),这两个方法都带有休眠时间参数,当其他线程都终止后并不代表当前休眠的线程会立即执行,而是必须当休眠时间结束后,线程才会转换到就绪状态。