1.InterruptException是个Exception啦,如果有相应的catch,就交给catch块,否则就向堆栈上方抛,一直抛到顶端中止整个程序。
2.根据javadoc上的说法,应该会收到InterruptedException,但是没有使用synchronized关键字,会产生一些问题
3.JVM可以调度一个线程进入阻塞状态,如果阻塞也可以看成中断的话

解决方案 »

  1.   

    >>>> chanceqw(★★★★★) 非常感谢你的解答.
    对于1,我的理解是调用sleep或wait方法会使线程t进入被中断状态,如果这时候,有一个其他的线程调用了t的interrupt方法,这会使"中断调用(sleep/wait方法)"抛出InterruptedException异常.线程的状态,根据<<Core Java>>中描述,只有四种:new(新线程),runnable(可运行状态),blocked(阻塞,Java doc中称之为interrupted status--被中断)和dead(死亡).
      

  2.   

    可以这么说当一个线程处于sleep或wait状态时,在没唤醒之前等于没有这个(当然是有的:-))线程
    所以你对他进行中断操作将不会有任何反应
      

  3.   

    >>>>>可以这么说当一个线程处于sleep或wait状态时,在没唤醒之前等于没有这个(当然是有的:-))线程,所以你对他进行中断操作将不会有任何反应    首先,请问何为sleep或wait状态,根据<<core java>>中的描述,是否都为blocked状态?
        如果是的话,那么请看:public class ThreadTest{
      public static void main(String[] args) throws Exception{
      //主线程
        Thread t1 = new PrinterThread('X');
        t1.start(); //实例化一个新线程,并启动之
        Thread.sleep(340); //主线程sleep
        t1.interrupt();    //在主线程中interrupt线程t1
      }
    }//一个线程类,简单地向控制台打印一个指定的字符
    class PrinterThread extends Thread{
      private char c;
      public PrinterThread(char c){
        this.c = c;
      }
        
      public void run(){
        try{
          while(true){
           synchronized(System.out){
            for(int i = 0; i < 10; i++)
               System.out.print(c);
             Thread.sleep(200);  //该线程sleep
             }
          }
        }catch(InterruptedException ex){
             System.err.println(ex.getMessage());
        }
      }
    }
       编译运行它,输出为:
    XXXXXXXXXXXXXXXXXXXXsleep interrupted可以看到线程处于sleep状态时被中断了的.
         
      

  4.   

    线程可以说有5种状态:新建、就绪(分配好资源、等待CPU时间片的状态)、运行(获得CPU时间)、阻塞、死亡
    我认为sleep和wait就是某段时间内(如果指定了时间长度),该线程不会参与线程的调度,就是JVM线程调度不会考虑它。因为它不再是“就绪”状态。直到sleep或者wait正常结束,才重新进入“就绪”状态,才可能被调度进入“运行”状态。所以在sleep或者wait时实际是阻塞状态,而不是就绪状态,interrupt显然不起作用,因为interrupt只对就绪态起作用。
    另外,我说的“中断”想表达的是“当前不运行”,不运行可能是就绪也可能是阻塞。从运行态转入就绪态可以是JVM自己调度的,如果这也算“中断”的话,那么这显然是interrupt之外的一种情况。