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

1.11.5 在sleep状态下停止

如果线程在sleep状态下,停止线程会是什么样的效果呢?

新建项目t14,类MyThread.java代码如下:


public class MyThread extends Thread {
@Override
public void run() {
    super.run();
    try {
        System.out.println("run begin");
        Thread.sleep(200000);
        System.out.println("run end");
    } catch (InterruptedException e) {
        System.out.println("在沉睡中被停止!进入catch!"+this.isInterrupted());
        e.printStackTrace();
    }
}
}

文件Run.java代码如下:


public class Run {

public static void main(String[] args) {
    try {
        MyThread thread = new MyThread();
        thread.start();
        Thread.sleep(200);
        thread.interrupt();
    } catch (InterruptedException e) {
        System.out.println("main catch");
        e.printStackTrace();
    }
    System.out.println("end!");
}

}

程序运行结果如图1-47所示。

图1-47 运行结果

从运行结果来看,如果线程在sleep状态下停止,则该线程会进入catch语句,并且清除停止状态值,变成false。

上述项目是先调用sleep(),再调用interrupt()方法停止,还有一个反操作在学习线程时也要注意,即先调用interrupt()方法,再调用sleep()方法,但这种方法也会出现异常。

新建项目t15,类MyThread.java代码如下:


public class MyThread extends Thread {
@Override
public void run() {
    super.run();
    try {
        for(int i=0;i<100000;i++){
            System.out.println("i="+(i+1));
        }
        System.out.println("run begin");
        Thread.sleep(200000);
        System.out.println("run end");
    } catch (InterruptedException e) {
        System.out.println("先停止,再遇到了sleep!进入catch!");
        e.printStackTrace();
    }
}
}

类Run.java代码如下:


public class Run {
public static void main(String[] args) {
    MyThread thread = new MyThread();
    thread.start();
    thread.interrupt();
    System.out.println("end!");
}
}

程序执行结果如图1-48所示。

图1-48 打印end!说明interrupt方法先执行了

控制台最下面的输出如图1-49所示。

图1-49 先调用interrupt()方法停止后遇到sleep报异常

不管其调用顺序,只要interrupt()和sleep()方法碰到一起就会出现异常:

1)在sleep状态执行interrupt()方法会出现异常;

2)调用interrupt()给线程打了中断标记,再执行sleep()方法也会出现异常。