interrupt概念

  interrupt翻译成中文为“打断”的意思,但实际上,interrupt()方法并非将一个线程打中断的意思。查看Thread.interrupt()方法的源码:

public void interrupt() {if (this != Thread.currentThread())checkAccess();synchronized (blockerLock) {Interruptible b = blocker;if (b != null) {interrupt0();           // Just to set the interrupt flagb.interrupt(this);return;}}interrupt0();}

  从以上源码可以知道,interrupt()方法只是设置了Thread对象中的一个标志位而已(Just to set the interrupt flag)。它的意义在于,线程可以通过这个标志位来决定需要做什么操作。

interrupt相关方法

  • interrupt()
    打断某个线程(设置标志位)
  • isInterrupted()
    查询某个线程是否被打断过(查询标志位)
  • interrupted()
    查询当前线程是否被打断过,并重置标志位
public class TestThread {public static void main(String[] args) {Thread thread = new Thread(() -> {try {Thread.sleep(5000);} catch (InterruptedException e) {System.out.println("Thread is interrupted");System.out.println(Thread.currentThread().isInterrupted());}});thread.start();try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}thread.interrupt();}
}

输出如下:

Thread is interrupted
false

  可知当线程sleep时,如果调用了interrupt()方法,将会抛出InterruptedException异常。捕获异常之后,会重置interrupt标志位。

wait、sleep、join与interrupt

  当一个线程在wait、sleep或join时,如果调用了其interrupt()方法,则会抛出InterruptedException异常。

synchronized与interrupt

  当一个线程在等待锁的时候,其能否被interrupt打断?

public class TestThread {public static void main(String[] args) {final Object o = new Object();new Thread(() -> {synchronized (o) {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}}}).start();Thread thread = new Thread(() -> {System.out.println("thread 获得锁");});thread.start();thread.interrupt();}
}

输出:

thread 获得锁

  可知当线程等待锁时,并不会被打断。

ReentrantLock与interrupt

public class TestThread {public static void main(String[] args) {Lock lock = new ReentrantLock();Thread t1 = new Thread(() -> {lock.lock();try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}lock.unlock();});Thread t2 = new Thread(() -> {lock.lock();System.out.println("t2 获得锁");lock.unlock();});t1.start();t2.start();t2.interrupt();}
}

输出:

t2 获得锁

  此时,线程在lock等待时依然不会被打断。如果希望线程在lock等待时可以被打断,可使用lockInterruptibly方法。

线程之interrupt相关推荐

  1. 多线程之interrupt

    interrupt 三兄弟 interrupt 设置中断标志位,打不打断,看线程自己安排 [当程序处于sleep,wait,join状态时打断线程,会抛出InterruptedException并重置 ...

  2. JAVA多线程之wait/notify

    本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...

  3. Java多线程之Synchronized和Lock的区别

    Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...

  4. java unpack_java多线程之park和unpack

    作用 用来创建锁和其他同步类的基本线程阻塞的原语.在查看AbstractQueuedSynchronizer(AQS)中,发现其底层就是使用LockSupport.park()和LockSupport ...

  5. Java多线程之sleep

    Java多线程之sleep 一.Sleep(long millis) 使当前正在执行的线程以指定的毫秒数暂停(暂时停止执行),具体取决于系统定时器和调度程序的精度和准确性. 线程不会丢失任何显示器的所 ...

  6. Android多线程之ArrayBlockingQueue源码解析

    阻塞队列系列 Android多线程之LinkedBlockingQueue源码解析 Android多线程之SynchronousQueue源码解析 Andorid多线程之DelayQueue源码分析 ...

  7. Asp.Net Core 轻松学-多线程之Task快速上手

    Asp.Net Core 轻松学-多线程之Task快速上手 原文:Asp.Net Core 轻松学-多线程之Task快速上手 前言     Task是从 .NET Framework 4 开始引入的一 ...

  8. linux 线程pthread_detach,linux线程之pthread_join和pthread_detach

    在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源和杀死.在 被其他线程回收之前,它的存储器资源(例如栈)是不释放的.相反 ...

  9. Java多线程之Callable、Future和FutureTask

    Java多线程之Callable接口 自己想总结一下的,看到一篇总结的更好的博客,就转载了,突然感觉真轻松,哈哈哈哈 文章转载于:Matrix海子:Java并发编程:Callable.Future和F ...

最新文章

  1. Android的全屏活动?
  2. 10的多少次方 oracle_初中数学:关于一元二次方程的中考经典例题,千万别错过!...
  3. python简笔画绘制 数据驱动绘图_python:绘制枫叶简笔画
  4. redis 慢查询日志
  5. CNN中各类卷积总结:残差、shuffle、空洞卷积、变形卷积核、可分离卷积等
  6. latex table 表格中 文字对齐
  7. CentOS7 安装ffmpeg
  8. 数学分析教程(科大)——1.7笔记+习题
  9. 比“虚幻4”还牛逼的游戏引擎 到底有多神奇?
  10. 如何用opencv(C++)读入sar.tif图(复数矩阵)(radasat2)
  11. 程序员的蜕变之旅-健身
  12. 4-MATLAB APP Design-文件选择函数uigetfile的使用
  13. Ubuntu Linux 安装 GCC Compiler
  14. 4核cpu云服务器性能,4核cpu云服务器性能测试
  15. PHP简约心灵鸡汤语句网站源码+包含数据
  16. 百度将推MIP 实现移动网页加速
  17. 基于RFID的仓储管理系统的设计与实现-毕业论文
  18. 如何切换ie浏览器的版本?
  19. 浅谈一下科班专科要学的各类东西
  20. TI RTOS Kernel

热门文章

  1. AndroidStudio写的个人信息修改界面
  2. 抗混叠滤波器 - 差分输入ADC的前端抗混叠RC滤波器设计实现
  3. 数据类型(数据类型简介、数据类型的分类(简单数据类型,获取变量数据类型,数据类型转换))
  4. Python教程:去除背景,我保证不动她一根头发(附多种方式)
  5. 《STL源码剖析》总结
  6. kafka consumer消费者 offset groupID详解
  7. 大数据分析和人工智能科普
  8. Centos8如何重启网络
  9. UNIX2DOS/DOS2UNIX for Windows
  10. dw css定位,css关于position属性的用法详解(绝对定位和相对定位的混淆)