这篇文章将为大家详细讲解有关java中断和终止线程的方法,文章内容质量较高,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
中断线程
线程中断仅仅是置线程的中断状态位,并不会停止线程。支持线程中断的方法也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,比如sleep、join等,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常,并且将中断标志重新置为false。所以在Java中设置线程的中断状态位并不会产生对线程运行的实际影响,而是通过监视线程的状态位并做相应处理,或者通过抛出中断异常(InterruptedException)来通知用户进行处理。
终止线程
当调用线程的start方法之后,线程会开始驱动任务,当任务执行完毕之后(也就是run方法执行结束)线程将终止,但是如果因为线程阻塞或者线程长时间执行而不能结束,所以我们希望能够通过某种途径可以终止线程以达到想要的效果,常用的方式有两种:中断、检查中断。
1、interrupt()
、isInterrupted()
、interrupted()
的作用
中断就是线程的一个标识位,它表示一个运行中的线程是否被其他线程调用了中断操作,其他线程可以通过调用线程的interrupt()
方法对其进行中断操作,线程可以通过调用isInterrupted()
方法判断是否被中断,线程也可以通过调用Thread
的interrupted()
静态方法对当前线程的中断标识位进行复位。
注意:不要认为调用了线程的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 = true InterruptThread正在执行 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中断和终止线程的方法,看完之后是否有所收获呢?如果想了解更多相关内容,欢迎关注亿速云行业资讯,感谢各位的阅读。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。