内核中断处理流程

我只是在观看Heinz Kabutz的VJUG采访 ,这启发了我写一篇有关中断的文章。 顺便说一句,我建议您订阅VJUG YouTube频道 -确实非常有用。

Heinz始终是物有所值的,很难不学习很多东西就很难观看他的演讲。 他提出了如何处理InterruptedException的主题,并假设很少有Java程序员可以正确地处理它。 我所读的关于Java的最喜欢的书– Java Concurrency In Practice (p138-144)中包含了我所阅读的关于线程中断的最佳解释。 如果您已阅读这些页面,您将知道如何正确处理InterruptedException :-)

这是一个简短的摘要:

您多久遇到一次此代码:

.......
try {Thread.sleep(1000);
} catch(InterruptedException e){e.printStackTrace();
}
......

一个进程需要Hibernate一秒钟,但“烦人”必须处理InterruptedException 。 开发人员实际上并不知道如何处理此异常,因此只需将其记录到控制台即可。

这是非常不好的做法! 如果您确定线程永远不会中断(您是在封闭系统中编写此代码),则可能应该执行类似的操作,例如在catch块中抛出AssertionError并添加注释,以免发生这种情况。 如果完全有可能线程被中断,那么您需要正确处理该中断。

可以通过调用其interrupt()方法来中断线程。 这会将其中断状态设置为true,因此当您调用isInterrupted()将返回true。 当调用interrupt() ,某些阻塞方法,例如Thread.sleep()将抛出InterruptedException 。 请注意,触发InterruptedException会将中断状态设置为false。 线程上有一个名为interrupted()的方法,该方法像isInterrupted()返回线程的中断状态,但关键是将中断状态设置回false。 ( interrupted()是一个非常奇怪的命名方法,…)

在以下示例中,我们可以看到所有这些工作:

package util;/*** Created by daniel on 16/04/15.*/
public class Interrupt {public static void main(String[] args) {Thread sleeperThread = new Thread(){public void run(){try {Thread.sleep(1000);} catch (InterruptedException e) {System.out.println(isInterrupted()); //prints falseinterrupt();System.out.println(isInterrupted()); //prints trueSystem.out.println(interrupted()); //prints trueSystem.out.println(isInterrupted()); //prints false}}};sleeperThread.start();sleeperThread.interrupt();}
}

在实践中引用Java并发性:

“ API或语言规范中没有任何内容可以将中断与任何特定的取消语义联系起来,但实际上,对除中断之外的任何事物使用中断都是脆弱的,并且在大型应用程序中难以维持。”

换句话说,中断只是一个信号。 从理论上讲,您可以使用中断机制来指示线程执行所需的任何操作,也许可以执行操作A而不是执行操作B –但是我们建议您不要这样做。

.......
try {Thread.sleep(1000);
} catch(InterruptedException e){actionA();return;
}
actionB();
......

那么处理中断的正确方法是什么。 好吧,这取决于您的代码。 假设我们使用“正确”的中断作为取消,并且您的代码希望发生取消(应在文档中指定),那么您的代码应以受控方式取消其操作。 仅仅因为抛出异常并不意味着您必须匆忙退出而将一团糟留在身后。 因为您已经处理了中断,所以无需恢复线程上的中断状态。

如果您不希望中断,那么您应该适当地处理该中断(也许完成您正在做的事情),然后在线程上恢复该中断,以便在堆栈上端处理一些代码。 请记住,一旦引发异常,中断状态将设置为false。 这是应该如何完成的方式(摘自本书的代码):

public Task getNextTask(BlockingQueue<Task> queue){boolean interrupted = false;try{while(true){try{return queue.take();}catch(InterruptedException e){interrupted = true;//retry}}}finally {if(interrupted){Thread.currentThread().interrupt();}}}

翻译自: https://www.javacodegeeks.com/2015/04/dealing-with-interruptions.html

内核中断处理流程

内核中断处理流程_处理中断相关推荐

  1. 中断处理过程示意图_PCIe中断方法和系统与流程

    本发明实施例涉及通信技术领域,尤其涉及一种PCIe中断方法和系统. 背景技术: PCIe(Peripheral Component Interconnect Express,高速外围组件互联)是最新的 ...

  2. Exynos4412 中断处理流程详解

    Linux 中,当外设触发中断后,大体处理流程如下: a -- 具体CPU architecture相关的模块会进行现场保护,然后调用machine driver对应的中断处理handler: b - ...

  3. 【内核】linux内核启动流程详细分析【转】

    转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...

  4. 【内核】linux内核启动流程详细分析

    Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...

  5. 深入理解LINUX内核 笔记 第四章 中断和异常

    中断和异常处理程序的嵌套执行 https://blog.csdn.net/denglin12315/article/details/121703669 一.历史 早前的Linux内核版本,中断分为两种 ...

  6. Linux中断处理流程

    看了一些网络上关于 linux 中断实现的文章,感觉有一些写的非常好,在这里首先感谢他们的无私付出,然后也想再补充自己对一些问题的理解.先从函数注册引出问题吧. 一.中断注册方法 在 linux 内核 ...

  7. linux 检查mps版本,linux_mps启动流程_存储相关.doc

    linux_mps启动流程_存储相关 Linux-mips启动流程 -存储相关 linux内核启动的第一个阶段是从 /arch/mips/kernel/head.s文件开始的.而此处正是内核入口函数k ...

  8. linux 内核 网卡驱动 移植,Linux内核移植步骤_添加DM9000网卡驱动(设备树).docx

    Linux内核移植步骤_添加DM9000网卡驱动(设备树) Linux内核移植步骤2015年05月13日星期三上午 11:05往设备树中添加网卡驱动:1.选平台,指定交叉编译工具链:(1).在Make ...

  9. linux 中断和进程 传递,Linux内核之进程上下文和中断上下文的区别

    进程上下文和中断上下文是操作系统中很重要的两个概念,这两个概念在操作系统课程中不断被提及,是最经常接触.看上去很懂但又说不清楚到底怎么回事.造成这种局面的原因,可能是原来接触到的操作系统课程的教学总停 ...

最新文章

  1. 用了5年的旧笔记本不要丢,1/4新机价格升级机器学习战斗本,隔壁研究员都馋哭了...
  2. 学点 C 语言(19): 数据类型 - 数组
  3. 移动app部分机型无法唤起h5支付宝支付_案例分析:H5支付交互体验设计
  4. [C++程序设计]指针总结
  5. 无法执行添加/移除操作,因为代码元素**是只读的
  6. python2与python3代码互相转化时注意事项
  7. 在linux中,我为什么不能安装VMware Tools?
  8. SwitchHosts提示切换hosts失败!没有修改'C:\WINDOWS\system32\drivers\etc\hosts'的权限问题
  9. response.setcontenttype的參数
  10. Bootstrap插件通过noConfllict 避免冲突
  11. java+yeild+sleep_java之yield(),sleep(),wait()区别详解-备忘笔记[转]
  12. [译] Martin Fowler - Web 应用安全基础
  13. adb shell循环命令_Android adb 命令使用总结
  14. 离职通知邮件主题写什么好_离职邮件主题怎么写
  15. 完成端口学习笔记(一):完成端口+控制台 实现文件拷贝
  16. 牛逼的电商运营为什么不自己开店铺要去打工?(知乎精选)
  17. Matlab音频信号的基本处理与分析
  18. mysql高效查询_mysql 高效率查询背景
  19. 计算机组装与维护教训,组装电脑:如果电脑出现异常一定要小心了,马虎可能会烧毁主板!...
  20. Flutter 适配安卓异形屏幕

热门文章

  1. P4302-[SCOI2003]字符串折叠【区间dp】
  2. jzoj3339-[NOI2013模拟]wyl8899和法法塔的游戏【博弈论,暴力】
  3. 泰勒及洛朗展开学习笔记
  4. 2017西安交大ACM小学期 文本查找[AC自动机]
  5. 19、mysql中定时器的创建和使用
  6. Spring Boot 热部署入门
  7. Jsoup代码解读之五-parser(中)
  8. Java 8 日期和时间解读
  9. 漫画:什么是一致性哈希
  10. (十)IDEA添加mybatis-mapp.xml文件