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

以操作系统和Java的视角看“中断“

引言

fucking-java-concurrency主要解读了在开发过程中常常会遇到的Java并发问题,本文主要总结Java的中断原理和应用。

PS: https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络,欢迎Star!

操作系统的中断

什么是中断?

中断可以归结为一种事件处理机制,通过中断发出一个信号, 用来响应硬件设备请求的一种机制。操作系统收到硬件的中断请求,会打断正在执行的进程,然后调用内核中的中断处理程序来响应请求。

中断解决了什么样问题?

当CPU需要访问外部设备时,必须不断地进行轮询和等待外部设备的状态, 这种轮询过程极大地浪费资源。中断机制有效地解决了CPU轮询和忙等待以检查外部设备状态所带来的性能损耗问题。

注意:操作系统收到中断请求,会打断其他进程的运行,所以中断请求的响应程序要尽可能快的执行完,这样可以减少对正常进程运行调度地影响。

中断过程

为了解决中断处理程序执行过长和中断丢失的问题,将中断过程分成了两个阶段,分别为上半部和下半部。

  • 上半部用来快速处理中断:一般会暂时关闭中断请求,主要负责处理跟硬件紧密相关或者时间敏感的事情。
  • 下半部用来延迟处理上半部未完成的工作:一般以内核线程的方式运行。

网卡例子

网卡收到网络包后,通过DMA方式将接收的数据写入内存,接着会通过硬件中断通知内核有新的数据到了。上半部会先禁止网卡中断,避免频繁硬中断。内核会触发一个软中断,把一些处理比较耗时且复杂的事情,交给软中断处理程序去做,也就是中断的下半部。

  • 上半部直接处理硬件请求,也就是硬中断,主要负责耗时短的工作,特点是快速执行。
  • 下半部分是由内核触发,也就是软中断,主要负责上半部未完成的工作。

Java的中断

Java中没有办法立即停止一个线程,Java提供了一种用于停止线程的协商机制:中断

Java的中断只是一种协商机制, 通过中断并不能直接中断另外一个线程,而需要被中断的线程自己处理中断, 通常,中断是实现取消的最合理方式

中断原理

每一个线程都有boolean标识,代表着是否有中断请求。线程可以选择在合适的时候处理该中断请求,甚至可以完全不理会该请求,就像这个线程没有被中断一样。

API

MethodDescription
void interrupt()中断线程,设置线程的中断位为true
boolean isInterrupted()检查线程的中断标记位,true-中断状态,false-非中断状态
static boolean interrupted()返回当前线程的中断标记位,同时清楚中断标记,改为false

注意:使用静态interrupted方法应该小心,因为它会清楚当前线程的中断状态,如果在调用interrupted时返回了true,那么除非你想屏蔽这个中断,否则必须对它进行处理——可以抛出InterruptedException,或者通过再次调用interrupt来恢复中断状态;

public class InterruptExample implements Runnable {BlockingQueue<Task> queue;@Overridepublic void run() {try {processTask(queue.take());} catch (InterruptedException e) {Thread.currentThread().interrupt(); // 恢复被中断的状态}}
}

案例讲解

可中断的阻塞

针对线程处于由sleep, wait, join, LinkedBlockingQueue#take等方法调用产生的阻塞状态时,调用interrupt方法,会抛出异常InterruptedException,同时会清除中断标记位,自动改成false;

LinkedBlockQueue#take()

public E take() throws InterruptedException {final E x;final int c;final AtomicInteger count = this.count;final ReentrantLock takeLock = this.takeLock;takeLock.lockInterruptibly(); // importanttry {while (count.get() == 0) {notEmpty.await();}x = dequeue();c = count.getAndDecrement();if (c > 1)notEmpty.signal();} finally {takeLock.unlock();}if (c == capacity)signalNotFull();return x;
}@ReservedStackAccess
final void lockInterruptibly() throws InterruptedException {if (Thread.interrupted()) throw new InterruptedException();if (!initialTryLock())acquireInterruptibly(1);
}

通过中断来取消

根据上述可中断的阻塞操作,可以通过中断来取消任务。

import java.math.BigInteger;
import java.util.concurrent.BlockingQueue;class PrimeProducer extends Thread {private final BlockingQueue<BigInteger> queue;PrimeProducer(BlockingQueue<BigInteger> queue) {this.queue = queue;}public void run() {try {BigInteger p = BigInteger.ONE;while (!Thread.currentThread().isInterrupted()) {queue.put(p = p.nextProbablePrime());}} catch (InterruptedException consumed) {// 允许线程退出}}public void cancel() {interrupt();}
}

综上

当调用可中断的阻塞函数时,有两种实用策略可用于处理InterruptedException

  • 传递异常,使你的方法也成为可中断的阻塞方法。
  • 恢复中断状态,从而使得调用栈中的上层代码能够对其进行处理。

参考资料

  • https://www.xiaolincoding.com/os/1_hardware/soft_interrupt.html
  • https://anyview.fun/2022/11/28
  • https://juejin.cn/post/7296751837340614671#2_6

相关文章:

以操作系统和Java的视角看“中断“

引言 fucking-java-concurrency主要解读了在开发过程中常常会遇到的Java并发问题&#xff0c;本文主要总结Java的中断原理和应用。 PS: https://github.com/WeiXiao-Hyy/blog整理了后端开发的知识网络&#xff0c;欢迎Star&#xff01; 操作系统的中断 什么是中断&#xff1…...

【运维】如何在Ubuntu 22上使用Python 3.8的虚拟环境

在Ubuntu 22上使用Python 3.8的虚拟环境安装Ryu是相对简单的。以下是一步一步的指南&#xff1a; https://qq742971636.blog.csdn.net/article/details/139566151 安装Python 3.8&#xff1a; 在Ubuntu 22上&#xff0c;Python 3.8可能不是默认安装的版本。你可以使用以下命令…...

门面模式Api网关(SpringCloudGateway)

1. 前言 当前通过Eureka、Nacos解决了服务注册和服务发现问题&#xff0c;使用Spring Cloud LoadBalance解决了负载均衡的需求&#xff0c;同时借助OpenFeign实现了远程调用。然而&#xff0c;现有的微服务接口都直接对外暴露&#xff0c;容易被外部访问。为保障对外服务的安全…...

玩转Matlab-Simscape(初级)- 09 - 在Simulink中创建曲柄滑块机构的控制模型

** 玩转Matlab-Simscape&#xff08;初级&#xff09;- 09 - 在Simulink中创建曲柄滑块机构的控制模型 ** 目录 玩转Matlab-Simscape&#xff08;初级&#xff09;- 09 - 在Simulink中创建曲柄滑块机构的控制模型 前言一、问题描述二、创建模型2.1 识别机构中的刚体2.2 确定刚…...

手撸一个java网关框架

手写一个简易的Java网关框架涉及到很多方面&#xff0c;但我会提供一个基本的框架概念和代码示例&#xff0c;帮助你理解网关的基本构建。以下是一个简单的Java网关框架的实现&#xff1a; 定义路由&#xff1a;需要一个路由表来映射请求的URL到对应的处理器。 请求处理&#x…...

亮数据代理IP助力高效数据采集

文章目录 &#x1f4d1;前言一、爬虫数据采集痛点二、代理IP解决爬虫痛点2.1 为什么可以2.2 本篇采用的代理IP 四、零代码获取数据4.1 前置背景4.2 亮数据浏览器自动抓取数据4.3 使用步骤&#xff1a; 五、数据集5.1 免费样本5.2 定制数据集 &#x1f324;️个人小结 &#x1f…...

VS2022,DLL1调用lib,lib调用DLL2

DLL1调用lib&#xff0c;lib调用DLL2 问题1&#xff1a;为什么在dll1中需要引入dll2的.lib文件 当你有一个工程&#xff08;dll1&#xff09;调用静态库&#xff08;lib&#xff09;&#xff0c;而静态库&#xff08;lib&#xff09;又调用另一个DLL&#xff08;dll2&#xf…...

Unity Mirror VR联机开发 房间篇

一、需求 在联机时通常有加入房间这个步骤&#xff0c;在mirror示例中也有相应的案例&#xff0c;但是那个比较复杂&#xff0c;我们做教育科普类不需要如此复杂&#xff0c;傻瓜式操作基本就可以了&#xff0c;所以我简化了步骤&#xff0c;省略了点击准备按钮这一步骤&#…...

二叉树—leetcode

前言 本篇博客我们来仔细说一下二叉树二叉树的一些OJ题目 请看完上一篇&#xff1a;数据结构-二叉树-CSDN博客 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;LeetCode_普通young man的博客-CSDN博客 若有问题 评论区见&#x1f4dd; &…...

shell编程(二)——字符串与数组

本文为shell 编程的第二篇&#xff0c;介绍shell中的字符串和数组相关内容。 一、字符串 shell 字符串可以用单引号 ‘’&#xff0c;也可以用双引号 “”&#xff0c;也可以不用引号。 单引号的特点 单引号里不识别变量单引号里不能出现单独的单引号&#xff08;使用转义符…...

【数据结构】二叉树专题

前言 本篇博客我们来看一些二叉树的经典题型&#xff0c;也是对上篇博客的补充 &#x1f493; 个人主页&#xff1a;小张同学zkf ⏩ 文章专栏&#xff1a;数据结构 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 ​ 目录 1.单值二叉树 …...

开源模型应用落地-LangChain高阶-LCEL-表达式语言(四)

一、前言 尽管现在的大语言模型已经非常强大,可以解决许多问题,但在处理复杂情况时,仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而,现在可以利用langchain来使得模型的应用变得更加直接和简单。 LCEL是什么? LCEL是一种非常灵活和强大的语言,可以帮助您更…...

Python第二语言(九、Python第一阶段实操)

目录 1. json数据格式 2. Python与json之间的数据转换 3. pyecharts模块官网 4. pyecharts快速入门&#xff08;折线图&#xff09; 5. pyecharts全局配置选项 5.1 set_global_ops使用 5.1.1. title_opts 5.1.2 legend_opts 5.1.3 toolbox_opts 5.1.4 visualmap_opts…...

Java异常机制

1.异常概述和异常处理机制 异常(exception)概述 异常就是程序在运行时出现的意外的&#xff0c;不正常的情况。 若异常产生后没有正确的处理&#xff0c;会导致程序的中断&#xff0c;程序不继续执行,以致造成损失。 2.2 异常处理机制 所以我们在开发中要一套机制来处理各种可能…...

Aws EC2,kubeadm方式安装kubernetes(k8s)

版本 docker版本&#xff1a;20.10.25 k8s版本&#xff08;kubeadm&#xff0c;kubelet和kubectl&#xff09;&#xff1a;1.20.10-0 初始化 # 禁用 SELinux sudo setenforce 0 sudo sed -i s/^SELINUXenforcing$/SELINUXpermissive/ /etc/selinux/config# 关闭防火墙 sudo …...

python 比较 mysql 表结构差异

最近在做项目的时候&#xff0c;需要比对两个数据库的表结构差异&#xff0c;由于表数量比较多&#xff0c;人工比对的话需要大量时间&#xff0c;且不可复用&#xff0c;于是想到用 python 写一个脚本来达到诉求&#xff0c;下次有相同诉求的时候只需改 sql 文件名即可。 com…...

【RAG入门教程01】Langchian框架 v0.2介绍

LangChain 是一个开源框架&#xff0c;旨在简化使用大型语言模型 (LLM) 创建应用程序的过程。可以将其想象成一套使用高级语言工具进行搭建的乐高积木。 它对于想要构建复杂的基于语言的应用程序而又不必管理直接与语言模型交互的复杂性的开发人员特别有用。它简化了将这些模型…...

python 做成Excel并设置打印区域

记录首次用python处理Excel表格的过程。 参考文章&#xff1a;https://www.jianshu.com/p/5e00dc2c9f4c 程序要做的事情&#xff1a; 1. copy 模板文件到 output 文件夹并重命名为客户指定的文件名 2. 从 DB 查询数据并将数据写入 Excel 3. 写数据的同时&#xff0c; 设置每…...

SpringAI(二)

大模型:具有大规模参数和复杂计算结构的机器学习模型.通常由深度神经网络构建而成,拥有数十亿甚至数千亿个参数.其设计目的在于提高模型的表达能力和预测性能,应对复杂的任务和数据. SpringAI是一个AI工程领域的应用程序框架 大概推出时间是2023年7月份(不确定) 目的是将S…...

小白都可以通过U盘重装系统,再也不用花50块钱去安装系统啦

下载Ventoy 软件 1、今天带着大家通过Ventoy 安装Windows 11 系统。 2、首先我们通过官网如下地址&#xff1a;https://www.ventoy.net/cn/&#xff0c;找到我们对应系统的Ventoy 软件安装包。 3、通过官网可以找到软件包的地址地址&#xff0c;如下图所示。 4、如下就是我下…...

CEF4Delphi 实战宝典:从组件详解到高级应用开发

1. CEF4Delphi入门指南&#xff1a;为什么选择这个框架&#xff1f; 如果你正在寻找一个能在Delphi应用中嵌入现代浏览器功能的解决方案&#xff0c;CEF4Delphi绝对是你的首选。这个基于Chromium Embedded Framework&#xff08;CEF&#xff09;的组件库&#xff0c;让我在过去…...

【双线GR指标实战解析】多空信号精准捕捉与波段持股策略

1. 双线GR指标的核心构成与基础逻辑 第一次接触双线GR指标时&#xff0c;我被它简洁明了的视觉呈现所吸引。这个指标主要由两条动态曲线和四根分档线组成&#xff0c;就像交通信号灯一样直观地指示着多空方向。**R线&#xff08;红色&#xff09;**在上方如同市场情绪的体温计&…...

Janus-Pro-7B实现简单编译器前端:词法分析与语法树生成演示

Janus-Pro-7B实现简单编译器前端&#xff1a;词法分析与语法树生成演示 最近在琢磨怎么把大模型的能力用到计算机科学的教学里&#xff0c;特别是编译原理这块。编译原理听起来挺唬人的&#xff0c;什么词法分析、语法树&#xff0c;很多同学一上来就被这些概念给绕晕了。传统…...

Llama-3.2V-11B-cot 与 Java 八股文知识库结合:构建动态更新的面试学习系统

Llama-3.2V-11B-cot 与 Java 八股文知识库结合&#xff1a;构建动态更新的面试学习系统 1. 引言 最近和几个准备跳槽的朋友聊天&#xff0c;发现他们都在为同一件事头疼&#xff1a;Java八股文。不是题目太难&#xff0c;而是变化太快。今天还在背HashMap的源码&#xff0c;明…...

Ubuntu 18.04.6 Live Server 部署实战:从零构建高效服务器环境

1. 为什么选择Ubuntu 18.04.6 Live Server&#xff1f; 如果你正在寻找一个稳定、轻量且适合生产环境的Linux服务器系统&#xff0c;Ubuntu 18.04.6 Live Server绝对值得考虑。这个长期支持版本&#xff08;LTS&#xff09;会持续获得安全更新直到2028年&#xff0c;这意味着你…...

STC89C51单片机计算器实战:从Proteus仿真到实物焊接全流程解析

STC89C51单片机计算器实战&#xff1a;从Proteus仿真到实物焊接全流程解析 对于电子爱好者来说&#xff0c;能够将一个创意从虚拟仿真转变为实际可用的硬件设备&#xff0c;这种成就感无与伦比。本文将带你完整经历基于STC89C51单片机的计算器项目开发全流程&#xff0c;从Prot…...

MedianFilterLib:嵌入式实时中值滤波高效实现

1. MedianFilterLib 库深度解析&#xff1a;面向嵌入式实时系统的高效中值滤波实现中值滤波是嵌入式信号处理中最基础、最有效的非线性去噪手段之一&#xff0c;尤其适用于抑制脉冲干扰&#xff08;如开关噪声、接触抖动、EMI瞬态&#xff09;和保留信号边缘特征。在资源受限的…...

这次终于选对!倍受青睐的AI论文写作软件 —— 千笔·专业学术智能体

你是否曾为论文选题发愁&#xff0c;反复修改却总对表达不满意&#xff1f;是否在深夜面对空白文档文思枯竭&#xff0c;又担心查重率过高&#xff1f;论文写作的每一步都充满挑战&#xff0c;从开题到定稿&#xff0c;每一个环节都可能成为“卡壳”的节点。如果你也在经历这些…...

crewAI 可观测性体系:Langfuse/Phoenix 集成与执行链路追踪

crewAI 可观测性体系&#xff1a;Langfuse/Phoenix 集成与执行链路追踪 本文基于 crewAI v1.11.0&#xff0c;介绍如何为多智能体系统建立完整的可观测性基础设施。 一、为什么多智能体系统需要可观测性 一个 crewAI Crew 在生产环境中运行时&#xff0c;你关心哪些问题&#…...

Deep Agents 的 Planning Capabilities 技术解析

一、概述 在传统的 LLM Agent 架构中&#xff0c;模型通常以“单步响应”&#xff08;single-step reasoning&#xff09;的方式执行任务&#xff0c;即输入 → 推理 → 输出。这种模式在简单任务中表现良好&#xff0c;但在面对多步骤、长周期、依赖复杂的任务时&#xff0c;…...