当前位置: 首页 > article >正文

java线程中断的艺术

文章目录

    • 引言
    • java中的中断
      • 何时触发中断阻塞
      • 如何响应中断
    • 中断的一些实践
      • 基于标识取消任务
      • 如何处理阻塞式的中断
      • 合理的中断策略
      • 时刻保留中断的状态
      • 超时任务取消的最优解
      • 处理系统层面阻塞IO
    • 小结
    • 参考

引言

我们通过并发编程提升了系统的吞吐量,特定场景下我们希望并发的线程能够及时的合理的停止,所以就来聊聊java并发编程中中断的哲学。

java中的中断

何时触发中断阻塞

当出现以下几种情况,线程就会触发阻塞或者暂停:

  1. 等待IO操作返回
  2. 等待线程休眠醒来
  3. 等待获取java同步锁

此时,线程就会处于BLOCKEDWAITINGTIMED_WAITING、几种状态

如何响应中断

在操作系统中,线程的中断方式一般有两种:

  1. 抢占式:当线程需要中断时,直接让线程立刻停止手里的任务。
  2. 协作式:当线程需要中断时,通过标识告知线程需要被中断,线程轮询时看到这个标识就会直接中断。

而Java线程则是采用协作式中断,通知对于中断的后线程触发InterruptedException,通常来说我们对线程中断响应度越高,就越容易及时取消一些非必要的操作,对应按照如下两种方式进行响应:

如果当前业务层面不具备处理此类异常的能力,那么就将异常向上层抛出传递给调用者:

public void func() throws InterruptedException {Thread.interrupted();}

如果类似于Runnable 这种无法向上抛出的内置接口类的实现,我们则可以主动去捕获中断,并将当前线程打断从而让高层栈帧感知到这个异常中断:

class Task implements Runnable {@Overridepublic void run() {try {Thread.sleep(1000);} catch (InterruptedException e) {//打断当前线程引发更高层线程响应此中断Thread.currentThread().interrupt();}}}

中断的一些实践

基于标识取消任务

所以对于线程的的中断,我们可以采用协作式标识来停止线程,通过任务运行时轮询检测,一旦看到标识设置为true即已请求取消,则提前结束运行。

就像下面这段代码,我希望的任务是每个1s输出一次,为了让任务的能够及时停止,我们采用volatile标识cancelled,这样就能取消操作尽可能及时可见:

public class Task implements Runnable {/*** 使用volatile修饰保证标识修改可见*/private volatile boolean cancelled = false;private final Thread thread = new Thread(this);public void start() {thread.start();}/*** 停止时,通过cancel请求取消*/public void cancel() {cancelled = true;}@Overridepublic void run() {//取消标识检测,如果取消则直接结束循环while (!cancelled) {System.out.println("running");ThreadUtil.sleep(1000)
http://www.lryc.cn/news/2385641.html

相关文章:

  • 【信息系统项目管理师】一文掌握高项常考题型-项目进度类计算
  • HarmonyOS 鸿蒙应用开发基础:转换整个PDF文档为图片功能
  • Flask-SQLAlchemy核心概念:模型类与数据库表、类属性与表字段、外键与关系映射
  • 刷题 | 牛客 - js中等题-下(更ing)30/54知识点解答
  • RAM(随机存取存储器)的通俗解释及其在路由器中的作用
  • 六、【前端启航篇】Vue3 项目初始化与基础布局:搭建美观易用的管理界面骨架
  • 【项目需求分析文档】:在线音乐播放器(Online-Music)
  • C++ 前缀和数组
  • PHP 实现通用数组字段过滤函数:灵活去除或保留指定 Key
  • NACOS2.3.0开启鉴权登录
  • 细胞冻存的注意事项,细胞冻存试剂有哪些品牌推荐
  • 快速上手Linux火墙管理
  • [创业之路-375]:企业战略管理案例分析 - 华为科技巨擘的崛起:重构全球数字化底座的超级生命体
  • 【paddle】常见的数学运算
  • AI基础知识(05):模型提示词、核心设计、高阶应用、效果增强
  • 分布式事务之Seata
  • 推测解码算法在 MTT GPU 的应用实践
  • Axure酒店管理系统原型
  • 写实交互数字人在AI招聘中的应用方案
  • C++中IO类(iostream、fstream和sstream)知识详解和应用
  • Spring Boot中如何对密码等敏感信息进行脱敏处理
  • React从基础入门到高级实战:React 基础入门 - JSX与组件基础
  • 房贷利率计算前端小程序
  • 在Visual Studio中进行cuda编程
  • Fastrace:Rust 中分布式追踪的现代化方案
  • Linux云计算训练营笔记day13【CentOS 7 find、vim、vimdiff、ping、wget、curl、RPM、YUM】
  • 黑马Java基础笔记-15
  • Elasticsearch简单集成java框架方式。
  • 【RAG文档切割】从基础拆分到语义分块实战指南
  • stream数据流