java中线程的中断与终止
Java  /  管理员 发布于 8年前   180
线程的中断与终止
1、interrupt()
、isInterrupted()
、interrupted()
的作用
中断就是线程的一个标识位,它表示一个运行中的线程是否被其他线程调用了中断操作,其他线程可以通过调用线程的interrupt()
方法对其进行中断操作,线程可以通过调用isInterrupted()
方法判断是否被中断,线程也可以通过调用Thread
的interrupted()
静态方法对当前线程的中断标识位进行复位。
相关视频教程推荐:java在线视频
注意:不要认为调用了线程的interrupt()方法,该线程就会停止,它只是做了一个标志位。
如下:
public class InterruptThread extends Thread{ @Override public void run() { //一个死循环 while (true){System.out.println("InterruptThread正在执行"); } }}public static void main(String[] args) throws InterruptedException { InterruptThread interruptThread = new InterruptThread(); interruptThread.start(); interruptThread.interrupt();//调用线程的interrupt() System.out.println("interruptThread是否被中断,interrupt = " + interruptThread.isInterrupted()); //此时isInterrupted()方法返回true}输出结果:interruptThread是否被中断,interrupt = trueInterruptThread正在执行InterruptThread正在执行InterruptThread正在执行//...
可以看到当你调用了线程的interrupt()方法后,此时调用isInterrupted()方法会返回true,但是该线程还是会继续执行下去。所以怎么样才能终止一个线程的运行呢?
2、终止线程的运行
一个线程正常执行完run方法之后会自动结束,如果在运行过程中发生异常也会提前结束;所以利用这两种情况,我们还可以通过以下三种种方式安全的终止运行中的线程:
2.1、利用中断标志位
前面讲到的中断操作就可以用来取消线程任务,如下:
public class InterruptThread extends Thread{ @Override public void run() { while (!isInterrupted()){//利用中断标记位System.out.println("InterruptThread正在执行"); } }}
当不需要运行InterruptThread线程时,通过调用InterruptThread.interrupt()使得isInterrupted()返回true,就可以让线程退出循环,正常执行完毕之后自动结束。
2.2、利用一个boolean变量
利用一个boolean变量和上述方法同理,如下:
public class InterruptThread extends Thread{ private volatile boolean isCancel; @Override public void run() { while (!isCancel){//利用boolean变量System.out.println("InterruptThread正在执行"); } } public void cancel(){ isCancel = true; }}
当不需要运行InterruptThread线程时,通过调用InterruptThread.cancel()使isCancel等于true,就可以让线程退出循环,正常执行完毕之后自动结束,这里要注意boolean变量要用volatile修饰保证内存的可见性。
2.3、响应InterruptedException
通过调用一个线程的 interrupt() 来中断该线程时,如果该线程处于阻塞、限期等待或者无限期等待状态,那么就会抛出 InterruptedException,从而提前结束该线程,例如当你调用Thread.sleep()方法时,通常会让你捕获一个InterruptedException异常,如下:
public class InterruptThread extends Thread{ @Override public void run() { try{while (true){ Thread.sleep(100);//Thread.sleep会抛出InterruptedException System.out.println("InterruptThread正在执行");} }catch (InterruptedException e){e.printStackTrace(); } }}
当不需要运行InterruptThread线程时,通过调用InterruptThread.interrupt()使得 Thread.sleep() 抛出InterruptedException,就可以让线程退出循环,提前结束。在抛出InterruptedException异常之前,JVM会把中断标识位复位,此时调用线程的isInterrupted()方法将会返回false。
java相关文章教程推荐:java编程入门
以上就是java中线程的中断与终止的详细内容,更多请关注其它相关文章!
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号