每个线程对象都有一个boolean类型的标志位(可以称为中断标志位),代表是否有中断请求,通过这个标志位可以实现线程终止功能。在最新的任务取消函数中,写下如下代码:Threadt=newThread(newRunnable(){@Overridepublicvoidrun(){while(!Thread.interrupted()){try{System.out.println(“我很好”);Thread.sleep(500);}catch(Exceptione){logger.warn(...);}}}});t.开始();定时调用t.interupt()。期待任务的结束。但是意外发生了。任务打印出“java.lang.InterruptedException:sleepinterrupted”日志后,任务继续运行。显然中断标志被清除了。检查sleep方法的描述如下:InterruptedException-如果有任何线程中断了当前线程。抛出该异常时,当前线程的中断状态被清除。睡眠中出现InterruptedException后,中断标志被清除。顺便看一下InterruptedException的描述:当一个线程正在等待、休眠或以其他方式被占用时抛出,线程被中断,可能是在活动之前,也可能是活动期间。有时一个方法可能希望测试当前线程是否已经被中断,如果是,就立即抛出这个异常。下面的代码可以用来实现这个效果:if(Thread.interrupted())thrownewInterruptedException();当线程正在等待、休眠或以其他方式被占用,并且线程处于活动状态时在中断之前或中断期间抛出。有时一个方法可能希望测试当前线程是否已经被中断,如果是,立即抛出这个异常。if(Thread.interrupted())thrownewInterruptedException();可以使用下面的代码实现这个效果;修改原代码捕获InterruptedExceion并处理:Threadt=newThread(newRunnable(){@Overridepublicvoidrun(){while(!Thread.interrupted()){try{System.out.println("I我没问题");Thread.sleep(500);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}catch(Exceptione){e.printStackTrace();}}}});t.开始();运行后,中断后可以实现取消功能。总结:当出现InterruptException时,必须进行处理,抛出异常或者重新标记中断标志。尤其是方法被别人调用的时候,最好不要吞掉中断,也就是捕获到InterruptedException后,在catch中什么都不做。
