首页新闻找找看学习计划

java多线程中,sleep和interrupt方法结合停止线程时,两种情况?

0
[已解决问题] 解决于 2018-09-14 09:59

第一种:
线程类
public class MyThread extends Thread {
@Override
public void run() {
try {
System.out.println("在沉睡中被停止,进入try!"+this.isInterrupted());
System.out.println("run begin");
Thread.sleep(200000);
System.out.println("run end");
} catch (Exception e) {
System.out.println("在沉睡中被停止,进入catch!"+this.isInterrupted());
e.printStackTrace();
}
}
}

测试类
public class Test {
public static void main(String[] args) {
try {
MyThread mt = new MyThread();
mt.start();
Thread.sleep(100);
mt.interrupt();
} catch (Exception e) {
System.out.println("main catch");
e.printStackTrace();
}
System.out.println("end!!!");
}
}

console结果:
在沉睡中被停止,进入try!false
run begin
end!!!
在沉睡中被停止,进入catch!false
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.qf.MyThread.run(MyThread.java:14)
===============================================================
第二种:线程类不变,测试类注释sleep方法
public class Test {
public static void main(String[] args) {
try {
MyThread mt = new MyThread();
mt.start();
//Thread.sleep(100);
mt.interrupt();
} catch (Exception e) {
System.out.println("main catch");
e.printStackTrace();
}
System.out.println("end!!!");
}
}
console结果:
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)
at com.qf.MyThread.run(MyThread.java:14)
end!!!
在沉睡中被停止,进入try!true
run begin
在沉睡中被停止,进入catch!false

想问下:
为什么两次结果“在沉睡中被停止,进入try!false”和“在沉睡中被停止,进入try!true”会不一样?

*青锋*的主页 *青锋* | 初学一级 | 园豆:180
提问于:2018-09-07 09:56
< >
分享
最佳答案
0

主线程和子线程是独立运行的,有sleep(100)的这个,在这100ms中子线程已经运行过了,进入了sleep(200000),而没有这100ms,主线程抢在了子线程的前面运行了mt.interrupt();

奖励园豆:5
流年飞雨 | 小虾三级 |园豆:1978 | 2018-09-09 14:56
其他回答(1)
0

有sleep方法的测试类,在运行时main线程会被暂停,mt线程得到执行机会,所以interrupt方法会在mt线程对象执行后才能执行,所以当mt线程对象执行时,首先打印“在沉睡中被停止,进入try!false”
未使用sleep方法的测试类,在运行时main线程会比自定义线程先执行,会先标记mt线程状态,所以调用mt线程时首先会打印“在沉睡中被停止,进入try!true”

*青锋* | 园豆:180 (初学一级) | 2018-09-07 17:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册