4.1.5.3. Interrupt
方法结束线程使用interrupt()方法来中断线程有两种情况:
1. 线程处于阻塞状态:如使用了sleep,同步锁的wait,socket中的receiver,accept等方法时,会使线程处于阻塞状态。当调用线程的interrupt()方法时,会抛出InterruptException异常。阻塞中的那个方法抛出这个异常,通过代码捕获该异常,然后break跳出循环状态,从而让我们有机会结束这个线程的执行。通常很多人认为只要调用interrupt方法线程就会结束,实际上是错的, 一定要先捕获InterruptedException异常之后通过break来跳出循环,才能正常结束run方法。
2. 线程未处于阻塞状态:使用isInterrupted()判断线程的中断标志来退出循环。当使用interrupt()方法时,中断标志就会置true,和使用自定义的标志来控制循环是一样的道理。
public class ThreadSafe extends Thread {
public void run() {
while ( !isInterrupted() ){ //非阻塞过程中通过判断中断标志来退出
try{
Thread.sleep(5*1000);//阻塞过程捕获中断异常来退出
}catch(InterruptedException e){
e.printStackTrace();
break;//捕获到异常之后,执行break跳出循环
}
}
}
}
说明:
1、以上是''Java核心知识点整理"一遍文章的内容,阅读了这段文字后,整理一下结论;
2、被volatile关键字修饰的变量,在一个线程中被修改后,其它线程立即可见,这叫volatile关键字的可见性;
3、当线程处于阻塞状态时,在其它线程中调用这个线程的interrupt()方法时,才会抛出InterruptException异常,同事一定要先捕获这个异常。
4、当线程处于非阻塞状态时,不抛出InterruptException异常,可以正常退出。