如果一个线程,调用了sleep, 那么它就会进入block 状态,如果期间调用了interrupt,就会抛出个异常。
那么是不是说,如果出现了异常,这个线程是不是肯定就终止了?
因为一般情况run()是这样写的
run(){
  try{XXX}
  catch(){}
}
这时如果出现异常,程序就跳到catch部分了,那么执行完catch,run也就执行完了,这样整个线程就结束了。有没有这样的可能
run(){while(true){
  try{XXX}
  catch(){}
}
}
在catch后,仍然不退出run?

解决方案 »

  1.   

    在 JDK 中所有会产生阻塞的方法都会抛受检异常 java.lang.InterruptedException。如果当前线程被其他线程使用 Thread#interrupt() 方法中断时,那么阻塞着的方法就会抛出这个异常。由于你提供的示例代码是个死循环,调用一次 interrupt() 方法的话,只会请求中断一次,如果这一次请求中断中断不了的话,那死循环会继续下去。如果捕获了这个异常而不处理的话,当前线程不会被中断,会继续执行下去。
    如果捕获了这个异常,而在 catch 块中写上:Thread.currentThread().interrupt(); 这句的话,那循环会继续下去,由于在 catch 块中再次请求中断,因此在每个的阻塞方法都不会进行阻塞。你提供的示例代码是有危险性的,有当前线程收到中断请求的话说明该线程应中断了,而不是忽略不管。应该改成这样:try {
        while(true) {
            xxxx;   // 这里含有会抛出 InterruptedException 的方法
        }
    } catch (InterruptedException e) {
        xxxx;  // 进行清扫工作结束线程的运行
        Thread.currentThread().interrupt();  // 为了保险起见再次请求中断一次
    }对于大多数的 Java 开发人员来说,基本上都会无视 java.lang.InterruptedException 这个异常,如果向外抛出的话也就罢了,最讨厌的就是直接 catch 住然后什么都不做,像这样!xxxx;  // 一堆语句
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    xxx;   // 再一堆语句
      

  2.   

    楼主的问题是不是怎样跳出 while 循环?
    如果是这样,有两个办法可行
    ①设置一个共享boolean变量
    boolean flag = true;public void run() {
       while(flag) {
           @#$@#$@#$@#$@#
       }
    }
    只要将flag设置成 false就可以跳出死循环了
    ②while(true) {
       try {
           @#$@#$@#$$
           Thread.sleep(1);  // 象征性的睡(有时候是必须得睡)
       } catch(InterruptedException e) {
           break; // break 之后跳出while循环
       }
    }
    向中断这个while循环的时候只要在主线程中调用一下 t.interrupt()就可以让这个t的run()方法结束了③还有其他的办法请楼下的兄弟们来补充 ^_^
      

  3.   


    有个问题没有理解明白,你说“如果捕获了这个异常而不处理的话,当前线程不会被中断,会继续执行下去”,你是说如果run()中是这样写的:
    run(){
    xxxx; // 一堆语句 
    try { Thread.sleep(5000); } 
    catch (InterruptedException e) { e.printStackTrace(); } 
    }当这个线程在sleep时,即使发生了interrupt,由于catch什么也没做,所以这个线程不会被终止?
      

  4.   


    1 都走到catch了,不终止还往哪里走?!!! .你的线程是执行完run方法就退出的
    2  1)以前的JDK版本是用interrupt status的,就是你的run里面有个while循环,假设可以运行好久,那么它可以检测自己线程 的interrupt status,如果为true,就跳出循环,结束自己,2)近些年jdk版本高了推荐像6楼一样用flag来搞3)还有一种很可古老的方法是用suspend,resume,不过已经deprecate的,因为它们不释放锁
       4) 如果在join,sleep,wait等方法中,本线程接收到其它线程调用的interrupt()方法,那么本线程会产生InterruptedException异常,并清除中断标志.所以你在catch块里永远检测不到中断标志
    3 这是月经贴了,哎...楼主要多查资 料的好,还是容易理解的