java引起线程中断的常见原因,java线程如何响应中断

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: