zoukankan      html  css  js  c++  java
  • thread 中断 interrupt

    Thread.interrupted()和Thread.isInterrupted()和Thread.interrupt()异同

    共性:

    调用线程的interrupted()和isInterrupted()方法,只是接受了别的线程传过来的信号,给线程做了中断状态的标志,它们本身不能抛出InterruptedException,就不能直接对线程进行终止,但是可以利用它们来检测我们是否接受到了中断信号。

    区别:

    源码

    Thread.interrupted()是静态方法:内部实现是调用的当前线程的isInterrupted(),测试当前线程是否处于中断状态,执行后将中断状态标志为false。


    Thread.isInterrupted()是实例方法: 是调用该方法的对象所表示的那个线程的isInterrupted(),测试线程Thread对象是否已经处于中断状态,但不具有标记清除功能。

    也就是说,如果连续两次调用interrupted()方法,第一次调用时,如果当前线程接受到了中断信号,那么该方法会返回true,同时清除当前线程被标记的中断状态。第二次调用时,就会返回false了。

    调用Thread.interrupt()方法并不能真正停止线程,只是在当前线程做了一个中断的状态标志。

    interrupt() 方法只是改变中断状态而已,它不会中断一个正在运行的线程。这一方法实际完成的是,给受阻塞的线程发出一个中断信号,这样受阻线程就得以退出阻塞的状态。 更确切的说,如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,此时调用该线程的interrupt()方法,那么该线程将抛出一个 InterruptedException中断异常(该线程必须事先预备好处理此异常),从而提早地终结被阻塞状态。如果线程没有被阻塞,这时调用 interrupt()将不起作用,直到执行到wait(),sleep(),join()时,才马上会抛出 InterruptedException。

    注意:

    当线程A执行到wait(),sleep(),join()时,抛出InterruptedException后,中断状态已经被系统复位了,线程A调用Thread.interrupted()返回的是false。

    如果线程被调用了interrupt(),此时该线程并不在wait(),sleep(),join()时,下次执行wait(),sleep(),join()时,一样会抛出InterruptedException,当然抛出后该线程的中断状态也会被系统复位。

    (总结一下:调用interrupt()方法,立刻改变的是中断状态,但如果不是在阻塞态,就不会抛出异常;如果在进入阻塞态后,中断状态为已中断,就会立刻抛出异常)

    参考链接:https://www.cnblogs.com/onlywujun/p/3565082.html
    测试样例参考链接:https://blog.csdn.net/zhuyong7/article/details/80852884

    自律人的才是可怕的人
  • 相关阅读:
    Daily Scrumming 2015.10.20(Day 1)
    Buaaclubs项目介绍
    [转载] Linux创建用户后,切换用户报This account is currently not available
    NetFPGA-1G-CML从零开始环境配置
    Digilent Xilinx USB Jtag cable
    OVS流表table之间的跳转
    Linux换源
    Scapy安装以及简单使用
    Do in SDN
    KMP算法
  • 原文地址:https://www.cnblogs.com/lovelifest/p/14341303.html
Copyright © 2011-2022 走看看