停止线程不像停止一个循环break一样干脆。停止一个线程意味着在线程处理完任务之前停掉正在做的操作,也就是放弃当前的操作。虽然看起来简单,但是必须做好正确的防范措施,以便达到预期的效果。停止一个线程可以用Thread.stop(),但最好不要用它。虽然它确实可以停止一个正在运行的线程,但是这个方法是不安全的,而且已经作废的方法。
停止线程的方法
大多数停止一个线程用Thread.interrupt()方法,尽管方法的名称是"中止,停止"的意思,但这个方法不一定会停止一个正在运行的线程,还需要加入一个判断才可以完成线程的停止。
在Java中有3种方法可以停止正在运行的线程:
(1)使用退出标志使线程正常终止,也就是当run方法完成后线程终止。
(2)使用stop方法强行终止线程,但是不推荐使用这个方法,因为stop和suspend、resume一样,都是过期作废的方法。
(3)使用interrupt方法中断线程。
停止线程如何判断
调用thread.interrupt()方法,但是此方法并不会马上停止线程,只是在当前线程打了一个停止的标记,并不是真正的停止线程。
复制代码
packagecn.qlq.thread.three;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
publicclassDemo1extendsThread{
复制代码
结果:(仍然会执行完线程的run方法,也就是interrupt()方法并没有中断线程)
在Java的SDK种,提供了两个方法判断线程是否终止:
(1)this.interrupted(),测试当前线程是否已经中止(静态方法------测试当前线程是否已经是中断状态,执行后具有将状态标志清除为false的功能)
publicstaticbooleaninterrupted(){
returncurrentThread().isInterrupted(true);
}
(2)this.isInterrupted(),测试线程是否已经中断。(实例方法-----测试线程对象Thread对象是否已经是中断状态,但不清除状态标志)
publicbooleanisInterrupted(){
returnisInterrupted(false);
}
可以看出上面两个方法都调用了isInterrupted(boolean)方法,查看源码:(参数是是否重置状态)
this.interrupted()静态方法的研究--执行任何线程的此方法都相当于执行Thread.currentThread.interrupted(),会返回线程的中断状态并且会清除中断状态
总之,停止线程给大家简单的介绍了一些,希望大家多看看。