在最初的JDK版本中,Thread类提供了一个线程终止的方法stop()方法,但是现在在JDK源码中发现,stop()方法已经被废弃。主要原因是:stop()方法太过暴力。强制终止一个正在执行的线程。这样的话会造成一些数据不一致的问题。

 


现在常用的是线程中断的方法:严格的讲,线程中断不会使线程立即退出,而是给线程发送一个通知,告诉目标线程,有人需要你退出啦!至于目标线程接到通知后如果处理,则完全由目标线程自行决定。这点很重要,如果中断后,线程立即无条件退出,我们又会遇到stop()的老问题。

与线程中断有关的三个方法:
public void Thread.interrupt() //中断线程 public boolean Thread.isInterrupted()
//判断线程是否中断 public static boolean Thread.interrupted() //判断是否被中断,并清除当前中断状态
Thread.interrupt()方法是一个实例方法,它通知目标线程中断,也是设置中断标志位。中断标志位表示当前线程已经被中断了。

Thread.isInterrupted() 方法也是实例方法,主要是检查当前线程是否被中断(通过检查中断标志位),返回值是boolean类型。

Thread.interrupted() 方法也是用来判断当前线程是否被中断,但同时清除当前线程的中断标志位状态。

 

但是,如果我们单独的去调用Thread.interrupt()并不会去中断一个线程。比如下面的代码:
/** * ** 单独调用Interrupted并不会终止线程***** * * Created by songyangguang on
2018/7/20. */ public class InterruptedDemo { public static void main(String[]
args) { Thread t1 = new Thread() { @Override public void run() { while(true) {
System.out.println("The thread is waiting for interrupted!"); //Thread.yield();
} } }; t1.start(); t1.interrupt();//中断线程 System.out.println("The Thread is
interrupted!"); } }
运行后会发现,线程并没有并中断,而是一直指向下去。




原因:这上面的这个程序中,虽然对程序进行了中断,但是并没有进行中断处理逻辑。因此,t1线程被置为中断状态,但是这个没有中断处理逻辑程序的话,这个中断不会发生任何的作用。

           所以,可以将上面的代码增加中断处理逻辑代码。如下:
/** * ** 单独调用Interrupted并不会终止线程***** * * Created by songyangguang on
2018/7/20. */ public class InterruptedDemo { public static void main(String[]
args) { Thread t1 = new Thread() { @Override public void run() { while(true) {
System.out.println("The thread is waiting for interrupted!"); //中断处理逻辑
if(Thread.currentThread().isInterrupted()) { System.out.println("The thread is
interrupted!"); break; } //Thread.yield(); } } }; t1.start();
t1.interrupt();//中断线程 //System.out.println("The Thread is interrupted!"); } }

因此,通过上面的代码就可以看到,使用Thread.interrupt()方法处理现场中断,需要使用Thread.isInterrupted()判断线程是否被中断,然后进入中断处理逻辑代码。

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信