首先看段代码:package com.huaxia;public class Demo {
public static void main(String[] args) {
Thread t=new Thread(new StopRunnable());
System.out.println("子线程是否存活1: "+t.isAlive());
t.start();
System.out.println("子线程是否存活2: "+t.isAlive());
try {
Thread.sleep(10);
} catch (InterruptedException e) {
System.out.println("xxxxxxxxxxx");
e.printStackTrace();
}
System.out.println("子线程是否存活3: "+t.isAlive());
Thread.currentThread().interrupt();
t.interrupt();
System.out.println("子线程是否存活4: "+t.isAlive());
System.out.println("main thread over.");
}
}class StopRunnable implements Runnable{
@Override
public void run() {
int i=1;
while(!Thread.currentThread().interrupted()){
System.out.println(i++);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}运行后的一种结果:
子线程是否存活1: false
子线程是否存活2: true
1
子线程是否存活3: true
子线程是否存活4: true
main thread over.运行后的另外一种结果:
子线程是否存活1: false
子线程是否存活2: true
1
2
子线程是否存活3: true
子线程是否存活4: true
main thread over.
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)3 at com.huaxia.StopRunnable.run(Demo.java:30)
at java.lang.Thread.run(Thread.java:619)
4
5
6
7
...(线程不停,继续输出数字。)
问题:
首先说说自己的理解.
t.start();后,线程t处于可运行状态。分给它时间片之后,开始运行。运行刚开始休眠10ms。
主线程获得时间片开始运行。主线程开始休眠10ms.
然后线程t开始运行。调用t.interrupt()后,线程t中断。但是第二种输出结果,我就看不懂了。
什么时候会收到“java.lang.InterruptedException: sleep interrupted”谁能抽丝剥茧的帮我分析下代码啊?说说这两种运行结果的原因
public static void main(String[] args) {
Thread t=new Thread(new StopRunnable());
System.out.println("子线程是否存活1: "+t.isAlive());
t.start();
System.out.println("子线程是否存活2: "+t.isAlive());
try {
Thread.sleep(10);
} catch (InterruptedException e) {
System.out.println("xxxxxxxxxxx");
e.printStackTrace();
}
System.out.println("子线程是否存活3: "+t.isAlive());
Thread.currentThread().interrupt();
t.interrupt();
System.out.println("子线程是否存活4: "+t.isAlive());
System.out.println("main thread over.");
}
}class StopRunnable implements Runnable{
@Override
public void run() {
int i=1;
while(!Thread.currentThread().interrupted()){
System.out.println(i++);
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}运行后的一种结果:
子线程是否存活1: false
子线程是否存活2: true
1
子线程是否存活3: true
子线程是否存活4: true
main thread over.运行后的另外一种结果:
子线程是否存活1: false
子线程是否存活2: true
1
2
子线程是否存活3: true
子线程是否存活4: true
main thread over.
java.lang.InterruptedException: sleep interrupted
at java.lang.Thread.sleep(Native Method)3 at com.huaxia.StopRunnable.run(Demo.java:30)
at java.lang.Thread.run(Thread.java:619)
4
5
6
7
...(线程不停,继续输出数字。)
问题:
首先说说自己的理解.
t.start();后,线程t处于可运行状态。分给它时间片之后,开始运行。运行刚开始休眠10ms。
主线程获得时间片开始运行。主线程开始休眠10ms.
然后线程t开始运行。调用t.interrupt()后,线程t中断。但是第二种输出结果,我就看不懂了。
什么时候会收到“java.lang.InterruptedException: sleep interrupted”谁能抽丝剥茧的帮我分析下代码啊?说说这两种运行结果的原因
如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。
简单说interrupt主要是用来打破阻塞状态的
再来这个方法
public static boolean interrupted()
测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。
那么来分析一下你的代码吧:
1、你的子线程的while循环一直都为真,在这个线程内部这样调永远都是真,因为你的意思是当前线程没有中断,就执行循环,现在跑的就是这个线程,怎么可能处于中断状态,所以2-3-4都是true
2、Thread.currentThread().interrupt();没有任何作用,主线程是因为正常执行完毕而寿终正寝的
3、就是异常的产生, t.interrupt();代码发生的时候,t可能没有进入sleep,就不会得到异常;代码发生的时候,t正处于sleep阻塞状态,那么阻塞状态会马上被打破,而且会得到一个异常;因为调度时间有差异,所以你这个代码执行有差异,interrupt方法只调了一次,而子线程是一个循环,究竟会不会出异常,那要看运气了
4、主线程挂了之后,这个子线程没有任何干扰悠哉悠哉地睡一下打印一下……直到永远最后,楼主没有把interrupt方法搞清楚
请教这个错误描述是什么意思?什么情况下出现这个错误?