Java并发系列:中断机制

163 阅读5分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

一、中断理论

在这里插入图片描述 大白话就是,中断机制是一种协商,不会立刻给你停掉。并且协商中断后,后序具体怎么做需要你自己指定。

二、JUC中的中断

在java.lang.Thread类包下,线程中断机制主要有三种方法: 在这里插入图片描述

如何中断一个线程?——在什么场景下使用上述方法 也就是说这三个方法的特性是什么:

在这里插入图片描述

在这里插入图片描述

  • 1、返回当前线程中的中断状态,测试当前状态是否被中断。也就是说返回flag标志位。
  • 2、将当前线程的中断状态清零并重新设为false,清楚线程中断状态。

在这里插入图片描述

三、实现中断机制

在这里插入图片描述

1、如何停止中断运行中的线程

1、通过一个volatile变量 具体得:T1线程和T2线程共享一个volatile变量,当T2想要T1停止时,对这个volatile变量进行修改,当T1读取后进行中断。符合中断机制理论中协商思想:应由线程自己决定是否中断。 在这里插入图片描述

2、AtomicBoolean实现 原子布尔型,相较于volatile方法实现,只是修改了API 在这里插入图片描述 3、==interrupt实现== 实现原理:在需要中断的线程中不断监听中断状态,一旦发生中断,就执行相应的中断处理业务逻辑停止线程。(思想同上面两种方法) 示例代码: 在这里插入图片描述

void interrupt()源码在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

  • 当该线程阻塞调用wait()...方法,其他线程调用interrupt,则该线程中断阻塞状态并抛出InterruptedException。

实例方法boolean isInterrupted()源码: 在这里插入图片描述

  • 其中传递的ClearInterrupt参数,就是说明中断标志位是否需要重置。

总结: 在这里插入图片描述

2、当线程中断标志位被设为true,是不是立即停止线程?

在这里插入图片描述

  • 会抛出InterruptException异常,并且程序会一直循环下去

在这里插入图片描述

==那么为什么要在异常处再调用一次呢?== 因为上面讲过,当遇到wait、sleep等阻塞方法时,会立即中断阻塞状态,并且中断标志flag会复位,也就是又回到了false。

3、静态方法isInterrupted()

上面讲到此方法的特性,不仅查询flag状态,还会将其复位。也就是说两次调用它,可能第二次flag返回的为false。 源码分析:

在这里插入图片描述

  • ClearInterrupted参数上面讲过,flag复不复位由此参数决定。

# []()一、中断理论

![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fe0d0a64b8ec476696731e68f8edd896~tplv-k3u1fbpfcp-zoom-1.image)\
大白话就是,中断机制是一种协商,不会立刻给你停掉。并且协商中断后,后序具体怎么做需要你自己指定。

# []()二、JUC中的中断

在java.lang.Thread类包下,线程中断机制主要有三种方法:\
![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/97cfe498fe8b4d159662fe8c19fb9f0a~tplv-k3u1fbpfcp-zoom-1.image)

如何中断一个线程?——在什么场景下使用上述方法\
也就是说这三个方法的特性是什么:

![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3030af0e2ac146f980473bf1deaa311f~tplv-k3u1fbpfcp-zoom-1.image)

![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/69e53b717e8a41e6b491f92599bef419~tplv-k3u1fbpfcp-zoom-1.image)

-   1、返回当前线程中的中断状态,测试当前状态是否被中断。也就是说返回flag标志位。
-   2、将当前线程的中断状态清零并重新设为false,清楚线程中断状态。

![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1b085d65723c4988bffba8cdca0ea6a9~tplv-k3u1fbpfcp-zoom-1.image)

# []()三、实现中断机制

![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c188eb0e24254905ad9150416d1590ed~tplv-k3u1fbpfcp-zoom-1.image)

### []()1、如何停止中断运行中的线程

1、通过一个volatile变量\
具体得:T1线程和T2线程共享一个volatile变量,当T2想要T1停止时,对这个volatile变量进行修改,当T1读取后进行中断。符合中断机制理论中协商思想:应由线程自己决定是否中断。\
![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6b3eefe06fca4ea2a7c9bc6db4ec83fd~tplv-k3u1fbpfcp-zoom-1.image)

2、AtomicBoolean实现\
原子布尔型,相较于volatile方法实现,只是修改了API\
![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/fbea877cc25346d4ae2b1d40a768fa07~tplv-k3u1fbpfcp-zoom-1.image)\
3、*interrupt实现*\
实现原理:在需要中断的线程中不断监听中断状态,一旦发生中断,就执行相应的中断处理业务逻辑停止线程。(思想同上面两种方法)\
示例代码:\
![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e2f1ec697fa74a44b048cac7466a5e92~tplv-k3u1fbpfcp-zoom-1.image)

**void interrupt()源码**:\
![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a1fc454c04624e47baa4cac68c3392ff~tplv-k3u1fbpfcp-zoom-1.image)\
![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f977fa2413e44a408b4fcf8c783a893f~tplv-k3u1fbpfcp-zoom-1.image)\
![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/257c85e45ebb446fb264b4159662046c~tplv-k3u1fbpfcp-zoom-1.image)

-   当该线程阻塞调用wait()…方法,其他线程调用interrupt,则该线程中断阻塞状态并抛出InterruptedException。

**实例方法boolean isInterrupted()源码:**\
![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bb31fbc6223a4c02a0d4e0ca3bde37df~tplv-k3u1fbpfcp-zoom-1.image)

-   其中传递的ClearInterrupt参数,就是说明中断标志位是否需要重置。

总结:\
![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/eacb613423c943bb81e78314168a688b~tplv-k3u1fbpfcp-zoom-1.image)

### []()2、当线程中断标志位被设为true,是不是立即停止线程?

![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5317519279e840d9b8c8e699c0a3b538~tplv-k3u1fbpfcp-zoom-1.image)

-   会抛出InterruptException异常,并且程序会一直循环下去

![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ead45ed468534693852f1758cb50d207~tplv-k3u1fbpfcp-zoom-1.image)

*那么为什么要在异常处再调用一次呢?*\
因为上面讲过,当遇到wait、sleep等阻塞方法时,会立即中断阻塞状态,并且中断标志flag会复位,也就是又回到了false。

### []()3、静态方法isInterrupted()

上面讲到此方法的特性,不仅查询flag状态,还会将其复位。也就是说两次调用它,可能第二次flag返回的为false。\
**源码分析:**

![在这里插入图片描述](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/cfc11357bc7d469ea9e52ed773579118~tplv-k3u1fbpfcp-zoom-1.image)

-   ClearInterrupted参数上面讲过,flag复不复位由此参数决定。

语法说明

标题

文本样式

列表

图片

链接

目录

代码片

表格

注脚

注释

自定义列表

LaTeX 数学公式

插入甘特图

插入UML图

插入Mermaid流程图

插入Flowchart流程图

插入类图

快捷键

标题复制

一级标题

二级标题

三级标题

四级标题

五级标题
六级标题

# []()一、中断理论

# []()二、JUC中的中断

# []()三、实现中断机制

### []()1、如何停止中断运行中的线程

### []()2、当线程中断标志位被设为true,是不是立即停止线程?

### []()3、静态方法isInterrupted()

Markdown 2258 字数 63 行数 当前行 1, 当前列 0

HTML 892 字数 30 段落