内核中断处理流程_处理中断

内核中断处理流程

我只是在观看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

内核中断处理流程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337870.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言中assert函数是什么

点击上方蓝字关注我&#xff0c;了解更多咨询1、assert将通过检查表达式expresion的值来决定是否需要终止执行程序。2、如果表达式expresion的值是假的(即0)&#xff0c;它将首先向标准错误流stderr打印错误信息。通过调用abort函数终止程序运行。否则&#xff0c;assert没有效…

java怎么清空一个文件内容_如何从文本文件中删除特定内容? - java

我正在Java的SO的帮助下从事此项目的工作&#xff0c;正在读取一个文件夹&#xff0c;然后将其内容写入文件。然后&#xff0c;我需要浏览该内容&#xff0c;仅保留末尾带有Thumbnail.jpg的图像。编辑&#xff1a;public static final File outFile new File(System.getProper…

sci检索没有馆藏号_转变馆藏

sci检索没有馆藏号您是否曾经想替换过HashSet或HashMap使用的equals和hashCode方法&#xff1f; 或者有一个List的一些元素类型伪装成的List相关类型的&#xff1f; 转换集合使这成为可能&#xff0c;并且本文将展示如何实现。 总览 转换集合是LibFX 0.3.0的一项功能&#xf…

c语言中exit和return的区别

点击上方蓝字关注我&#xff0c;了解更多咨询1、返回函数值的return是关键字&#xff0c;exit是一个函数。return是语言级的&#xff0c;它表示调用堆栈的返回&#xff1b;exit是系统调用级的&#xff0c;它表示一个过程的结束。2、return是函数的退出&#xff0c;exit是进程的…

java怎样返回json_java怎么返回json

详细内容本篇文章将介绍如何编写Java程序来返回Json数据&#xff0c;本次以三个方式进行介绍。推荐课程&#xff1a;Java教程&#xff0c;方式1&#xff1a;当然是手敲所有代码&#xff0c;来进行json数据的返回。需要 HttpHttpServletRequest request HttpServletResponse res…

junit测试类叫什么名字_使用Junit测试名称

junit测试类叫什么名字命名测试 当我们创建Junit测试时&#xff0c;通常没有方法名称的实际使用。 Junit运行器使用反射来发现测试方法&#xff0c;并且从版本4开始&#xff0c;您不再被限制以test开始方法的名称。 测试方法的名称用于文档目的。 人们遵循不同的风格。 您可以…

c语言中realloc函数是什么

点击上方蓝字关注我&#xff0c;了解更多咨询1、判断当前指针是否有足够的连续空间。如果足够&#xff0c;扩大ptr指向的地址并返回。如果不够&#xff0c;如何根据size指定的大小分配空间&#xff0c;将原始数据复制到新分配的内存中&#xff0c;然后释放原始ptr指向的区域。2…

java 暂停循环_java小白关于while死循环时处理办法的一发求助帖

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼package greedsnake;import java.awt.Color;import java.awt.Font;import java.awt.Frame;import java.awt.Graphics;import java.awt.Image;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.awt.ev…

java jsp学习指南_JSP教程–最终指南

java jsp学习指南编者注&#xff1a; JavaServer Pages&#xff08;JSP&#xff09;技术使您可以轻松创建同时包含静态和动态组件的Web内容。 JSP技术提供了Java Servlet技术的所有动态功能&#xff0c;但提供了一种更自然的方法来创建静态内容。 JSP技术的主要功能包括用于开…

c语言中main函数是什么

点击上方蓝字关注我&#xff0c;了解更多咨询1、main函数是C程序的入口函数&#xff0c;即程序的执行从main函数开始&#xff0c;其他函数的调动也直接或间接地在main函数中调用。2、main函数的返回值用于解释程序的退出状态。若返回0&#xff0c;则表示程序正常退出。返回其他…

什么是通用字符名称?_通用名称

什么是通用字符名称&#xff1f;泛型类型参数名称通常包含一个大写字母字符。 如果您开始阅读有关泛型的官方ORACLE文档&#xff0c;则第一个示例是 /*** Generic version of the Box class.* param <T> the type of the value being boxed*/ public class Box<T>…

c语言中__cplusplus是什么

点击上方蓝字关注我&#xff0c;了解更多咨询1、__cplusplus和extern“C”一般都是配对使用&#xff0c;如果定义了__cplusplus(cpp文件默认定义了该宏)&#xff0c;则采用C语言方式进行编译。2、是在C中特有的&#xff0c;__cplusplus 其实就是C。实例#ifndef __CODERSRC_H__ …

git rollback代码都没了_git回滚线上代码

由于之前自己推代码的时候操作失误&#xff0c;才push代码的时候没有push到dev分支&#xff0c;而是push到了本地master同名分支的线上master分支&#xff0c;覆盖掉了线上在用的代码。在搜索解决办法的时候&#xff0c;发现网上给的信息大多不够全&#xff0c;且很多无用。所以…

c语言中fwirte函数的使用方法示例

点击上方蓝字关注我&#xff0c;了解更多咨询1、fwrite函数用于将缓冲区数据写入文件&#xff0c;并返回成功写入文件的元素数。如果出现错误或到达文件末尾&#xff0c;可能小于nmemb。2、fwrite函数不区分文件的尾部和错误&#xff0c;因此调用者必须使用feof和ferror来判断发…

联通光纤限制连接数_从数百万个光纤(而不是数千个线程)中查询数据库

联通光纤限制连接数jOOQ是在Java中执行SQL的好方法&#xff0c;而Quasar光纤带来了大大提高的并发性 我们很高兴在平行世界的 Fabio Tudone的jOOQ博客上宣布另一个非常有趣的来宾帖子。 Parallel Universe开发了一个开放源代码堆栈&#xff0c;使开发人员可以轻松地在JVM上对…

java 工程新建ivy文件_Hadoop学习之路(八)在eclispe上搭建Hadoop开发环境

一、添加插件将hadoop-eclipse-plugin-2.7.5.jar放入eclipse的plugins文件夹中二、在Windows上安装Hadoop2.7.5版本最好与Linux集群中的hadoop版本保持一致1、将hadoop-2.7.5-centos-6.7.tar.gz解压到Windows上的C盘software目录中2、配置hadoop的环境变量HADOOP_HOMEC:\softwa…

c语言中fclose函数的使用你会吗

点击上方蓝字关注我&#xff0c;了解更多咨询1、C语言fclose函数用于关闭使用fopen成功打开的文件。2、fopen函数和fclose函数总是成对出现。如果文件成功打开fopen函数&#xff0c;请使用fclose函数关闭文件。实例#include <stdio.h> #include <stdlib.h>int main…

悲观锁 引起死锁_悲观锁定时如何避免可怕的死锁-以及Java 8的一些用法!

悲观锁 引起死锁有时您根本无法避免&#xff1a;通过SQL进行悲观锁定。 实际上&#xff0c;当您要在共享的全局锁上同步多个应用程序时&#xff0c;它是一个很棒的工具。 有人可能认为这是在滥用数据库。 如果可以解决您遇到的问题&#xff0c;我们认为可以使用您拥有的工具。…

Java反序列化json内存溢出_fastJson与一起堆内存溢出'血案'

现象QA同学反映登录不上服务器排查问题1–日志级别查看log,发现玩家登录的时候抛出了一个java.lang.OutOfMemoryError大概代码是向Redis序列化一个PlayerMirror镜像数据,但是在JSON.toJSONString的时候出现了错误.比较清晰&#xff0c;即序列化的时候expandCapacity,内存不足。…

c语言中预处理器是什么

点击上方蓝字关注我&#xff0c;了解更多咨询1、C语言有预处理器&#xff0c;Java中没有这个概念&#xff0c;其实只是文本替换工具。2、C的预处理器&#xff0c;即CPP&#xff0c;将在实际编译器中完成处理&#xff0c;所有预处理命令将从#开始。实例#include <stdio.h>…