《Java多线程编程核心技术(第2版)》 —1.11.4 在sleep状态下停止线程
1.11.4 在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()方法也会出现异常。
- 点赞
- 收藏
- 关注作者
评论(0)