美文网首页
Thread-线程中断机制(interrupt)

Thread-线程中断机制(interrupt)

作者: 街角下的蚂蚁 | 来源:发表于2020-08-15 13:05 被阅读0次
  • 导语

在线程的中断机制里面有三个比较相似的方法,分别是interrupt()、isInterrupted()、interrupted(),之前一直没有了解的很透彻,记录一下。

Java的中断是一种协作机制。调用线程对象的interrupt方法并不一定就中断了正在运行的线程,它只是要求线程自己在合适的时机中断自己。每个线程都有一个boolean的中断状态(这个状态不在Thread的属性上),interrupt方法仅仅只是将该状态置为true。

方法对比

方法 描述
interrupt() 中断线程,将会设置该线程的中断状态位,即设置为true
isInterrupted() 判断某个线程是否已被发送过中断请求
interrupted() 判断某个线程是否已被发送过中断请求,并且将中断状态重新置为false

中断分析

如果一个线程处于了阻塞状态(如线程调用了thread.sleep、thread.wait、I/O操作方法等进入阻塞状态),则在线程检查中断标示时如果发现中断标示为true,则会在这些阻塞方法(sleep、wait、I/O 操作方法)调用处抛出InterruptedException异常,并且在抛出异常后立即将线程的中断标示位清除,即重新设置为false。抛出异常是为了线程从阻塞状态醒过来,并在结束线程前让程序员有足够的时间来处理中断请求。代码示例:

public static void main(String args[]) {
   Thread thread = new Thread(() -> {
       while (!Thread.currentThread().isInterrupted()) {
           try {
               Thread.sleep(1000);
               System.out.println("线程尚未被中断");
           } catch (InterruptedException e) {
               // 线程阻塞被中断后,抛出异常后,会将中断状态还原回去(置为false),在捕获异常后,可以将状态置为true,方便外层判断
               Thread.currentThread().interrupt();
               // 获取中断状态为true
               System.out.println("inner thread..." + Thread.currentThread().isInterrupted());
               e.printStackTrace();
           }
       }
       // 获取中断状态为true
       System.out.println("线程中断..." + Thread.currentThread().isInterrupted());
   });
   // 获取中断状态为false
   System.out.println("start thread..." + thread.isInterrupted());
   thread.start();
   try {
       Thread.sleep(3000);
   } catch (InterruptedException e) {
       e.printStackTrace();
   }
   // 获取中断状态为false
   System.out.println("interrupt thread ..." + thread.isInterrupted());
   // 线程内部调用了sleep阻塞方法,调用interrupt(),抛出InterruptedException异常
   thread.interrupt();
   try {
       Thread.sleep(3000);
   } catch (InterruptedException e) {
       e.printStackTrace();
   }
   // 获取中断状态为false?按照我的理解,线程在内部已经将中断状态置为了true,这里获取的依然为false,需要再研究一下
   System.out.println("end thread..." + thread.isInterrupted());
}

通过以上分析,对线程的中断机制应该有了一个基本的了解。但具体是如何实现中断,跟踪代码可以看到,是调用了native方法,下次再进行分享。

扫码关注了解更多

相关文章

  • Thread

    Thread-中断 interrupt() interrupt()用于中断线程,调用该方法的线程的状态将被置为"中...

  • Thread-线程中断机制(interrupt)

    导语 在线程的中断机制里面有三个比较相似的方法,分别是interrupt()、isInterrupted()、in...

  • Java线程Thread之interrupt中断解析

    这一篇我们说说Java线程Thread的interrupt中断机制。 interrupt之中断状态标记 inter...

  • 线程中断机制(interrupt)

    优雅的中断线程,是一门艺术 总所周知,Thread.stop, Thread.suspend, Thread.re...

  • Java线程的中断

    引言 Java没有提供任何机制来安全地终止线程,但提供了中断机制,即thread.interrupt()方法。线程...

  • 线程相关(六)interrput 和 yield

    interrupt调用interrupt(),通知线程应该中断了。这个很有意思,是通知线程应该中断,而不是中断线程...

  • 多线程基础

    多线程基础总结 一、线程中断 interrupt方法用来请求终止线程。 1. interrupt置位中断标志位 当...

  • 线程中断interrupt()、interrupted()和is

    interrupt() thread.interrupt(),该方法用于中断Thread线程,此线程并非当前线程,...

  • java线程相关

    中断一个正在运行的线程 中断阻塞线程的方法 我们调用线程对象的interrupt()方法时会产生Interrupt...

  • interrupt、interrupted和isInterrup

    1.interrupt() interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。 注...

网友评论

      本文标题:Thread-线程中断机制(interrupt)

      本文链接:https://www.haomeiwen.com/subject/pdhadktx.html