java引起线程中断的常见原因,java线程如何响应中断
线程的中断和终止
1、interrupt()、isInterrupted()、interrupted()的作用
它是一个线程的中断位,指示一个正在运行的线程是否被其他线程中断。其他线程可以通过调用该线程的interrupt()方法来中断它。线程可以通过调用isInterrupted()方法来判断是否被中断,线程也可以通过调用线程的interrupt()静态方法来重置当前线程的中断位。
相关视频教程推荐:java在线视频
注意:不要认为调用了线程的interrupt()方法,该线程就会停止,它只是做了一个标志位。
如下所示:
公共类InterruptThread扩展线程{
@覆盖
公共无效运行(){
//无限循环
while (true){
System.out.println(“中断线程正在执行”);
}
}
}
公共静态void main(String[] args)引发InterruptedException {
interrupt thread interrupt thread=new interrupt thread();
interrupt thread . start();
interrupt thread . interrupt();//调用线程的中断()
System.out.println(中断线程是否中断,中断=中断线程. is中断());
//此时,isInterrupted()方法返回true
}
输出结果:
中断线程被中断,中断=真
中断线程正在执行。
中断线程正在执行。
中断线程正在执行。
//.可以看到,当调用一个线程的interrupt()方法时,调用isInterrupted()方法此时会返回true,但线程会继续执行。那么,我该如何停止一个线程的运行呢?
2、终止线程的运行
一个线程正常执行run方法后会自动结束,运行过程中如果出现异常会提前结束;因此,利用这两种情况,我们可以通过以下三种方式安全地终止正在运行的线程:
2.1、利用中断标志位
上述中断操作可用于取消线程任务,如下所示:
公共类InterruptThread扩展线程{
@覆盖
公共无效运行(){
而(!interrupted(){//使用中断标志位
System.out.println(“中断线程正在执行”);
}
}
}当不需要运行InterruptThread时,通过调用InterruptThread.interrupt()使isInterrupted()返回true,可以让线程退出循环,正常执行后自动结束。
2.2、利用一个boolean变量
使用布尔变量类似于上述方法,如下所示:
公共类InterruptThread扩展线程{
私有可变布尔isCancel
@覆盖
公共无效运行(){
而(!IsCancel){//使用布尔变量
System.out.println(“中断线程正在执行”);
}
}
公共void取消(){
isCancel=true
}
}不需要运行InterruptThread时,可以通过调用InterruptThread.cancel()使isCancel等于true,让线程退出循环,正常执行后自动结束。这里需要注意的是,布尔变量要用volatile修饰,以保证内存的可见性。
2.3、响应InterruptedException
当一个线程通过调用它的interrupt()被中断时,如果线程被阻塞,等待有限的时间或者无限期等待,那么就会抛出InterruptedException,从而提前结束线程。例如,当您调用Thread.sleep()方法时,通常会捕获一个InterruptedException,如下所示:
公共类InterruptThread扩展线程{
@覆盖
公共无效运行(){
尝试{
while (true){
thread . sleep(100);//Thread.sleep引发中断的异常
System.out.println(“中断线程正在执行”);
}
}catch (InterruptedException e){
e . printstacktrace();
}
}
}当不需要运行InterruptThread时,调用InterruptThread.interrupt()让Thread.sleep()抛出InterruptedException,让线程退出循环,提前结束。在抛出InterruptedException之前,JVM会重置中断标志,调用线程的isInterrupted()方法会返回false。
java相关文章教程推荐:java编程入门以上是Java中线程中断和终止的细节。请多关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。