关于线程的问题,代码如下,在循环中我想在i=3的时候调用interrupt()方法打断sleep。疑问一:从interrupt字面上来看,应该是睡眠过程中打断,但实际上是睡眠完成后才执行打断,为什么会这样呢?都睡完了还叫打断么?疑问二:代码中是在i=3的时候执行打断,按我理解这个时候就应该进catch了,应该输出“异常出现: i = 3”, 事实上,执行了interrupt()后,catch了下,但是没进catch代码块,而是把本次循环执行完了;在下一次循环中再catch,然后进catch代码块,所以输出了“异常出现: i = 4”。这又是为什么呢?小弟着实迷茫,希望各位大大指点迷津!public class ThreadTest extends Thread {
public void run(){
for(int i = 0; i< 10; i++){
try {
Thread.sleep(2000);
if(i == 3)
Thread.currentThread().interrupt();
} catch (InterruptedException e) {
System.out.println("异常出现: i = " + i);
return;
}
System.out.println(i);
}
}
public static void main(String[] args) {
ThreadTest t = new ThreadTest();
t.start();
}
}输出如下:
0
1
2
3
异常出现: i = 4threadjava线程多线程
public void run(){
for(int i = 0; i< 10; i++){
try {
Thread.sleep(2000);
if(i == 3)
Thread.currentThread().interrupt();
} catch (InterruptedException e) {
System.out.println("异常出现: i = " + i);
return;
}
System.out.println(i);
}
}
public static void main(String[] args) {
ThreadTest t = new ThreadTest();
t.start();
}
}输出如下:
0
1
2
3
异常出现: i = 4threadjava线程多线程
第二个。
i=3的时候并没有抛出异常,debug一步一步的下去你会观察到的。
是i=4的时候抛出的异常。
package test;public class ThreadTest extends Thread {
public void run() {
int i = 0;
for (; i < 10; i++) {
try {
if (i == 3)
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
System.out.println("异常出现: i = " + i);
return;
}
System.out.println(i);
}
}
}package test;public class MainThread extends Thread {
static ThreadTest t;
public void run() {
t.interrupt();
}
public static void main(String[] args) {
t = new ThreadTest();
t.start();
try {
System.out.println("主线程睡1秒(目的:保证t已经执行完3次循环,且已经sleeep),调用打断t的方法");
Thread.sleep(1000);
startInterrupt();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private static void startInterrupt(){
MainThread tThread = new MainThread();
tThread.start();
}
}
2、中断作为一种协作机制,不会强求被中断线程一定要在某个点进行处理。例如,这里是i=3的时候发生了中断,但并Thread.currentThread()不一定马上就处理这个异常,而是会选择合适的时候来处理异常。
具体可以参考:
http://www.infoq.com/cn/articles/java-interrupt-mechanism