关于线程的问题,代码如下,在循环中我想在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线程多线程

解决方案 »

  1.   

    第一个疑问,你不觉得只有sleep结束了之后,才会运行到Thread.currentThread().interrupt();这一句么?
    第二个。
    i=3的时候并没有抛出异常,debug一步一步的下去你会观察到的。
    是i=4的时候抛出的异常。
      

  2.   

    sleep结束了后,线程不是有进入正常状态了么,要是这样的话何必要有sleep的情况下才能执行interrupt呢?直接不用sleep就interrupt不可以么?第二个,我debug过的,是i=3的时候抛出异常,并且执行了catch语句,但是没进catch代码块,i=4的时候又执行了catch,这时候才进的。按代码的逻辑,不是应该i=3的时候就应该进catch的吗?小弟愚钝
      

  3.   

    它只是被中断了,但是没有抛出异常,如果throw new interruptexception() 就会是3 了, try只会抓异常,你if(i==3)只是打断了现成而已
      

  4.   

    你在一个线程里是看不到效果的。在主线程里interrupt。
      

  5.   

    1、中断一般是2个线程之间的协作。像LZ这种同一个线程里,自己中断自己的情况,是达不到效果的。如果要达到效果,至少需要2个线程,我改了下:
    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
      

  6.   

    你对for循环的执行顺序理解错误for(int i = 0; i< 10; i++)、当i<10后进入循环体,执行完里面的代码,然后才进行i++。