java – 什么时候应该抛出一个方法抛出InterruptedException,我该如何处理一个呢? (阻断方法)

如果一个方法必须是一个阻止方法,我是否正确的想,如果我离开
抛出InterruptedException,我犯了一个错误?

简而言之:

>一个阻塞方法应该包括throws InterruptedException,否则是一个普通的方法.
>阻塞方法可能会影响响应速度,因为可能难以预测何时完成这就是为什么需要抛出InterruptedException.

那是对的吗?

解决方法

不,我没有找到你的摘要是正确的.通常,如果你正在编写一个方法来调用别人抛出InterruptedException,那么你的方法也应该抛出抛出的InterruptedException,除非你有一个很好的计划,当你的方法依赖于信号中断时.

您能够吸收这种中断的情况很少见.也许你正在计算一个迭代的解决方案,精度随着时间的推移而增加,但是当您的线程被中断时,您决定在规定的时间内达到的解决方案已经足够好了,并且仍然足以返回.换句话说,该解决方案仍然在您的方法范围内.

想像:

private double improveUpon(double start) throws InterruptedException {
  // ...
}


public double compute() {
  double result = 0.0;
  try {
    do {
      result = improveUpon(result);
    } while (couldBeImproved(result));
  } catch (InterruptedException ex) {
    Thread.currentThread().interrupt();
  }
  return result;
}

或者,如果您只想遵守中断请求,则可以在不执行InterruptedException的情况下执行此操作:

private double improveUpon(double start) {
  // ...
}


public double compute() {
  final Thread current = Thread.currentThread();
  double result = 0.0;
  do {
    result = improveUpon(result);
  } while (couldBeImproved(result) &&
           !current.isInterrupted());
  return result;
}

对于另一个变体,请考虑您的方法必须完成其所有工作或向调用者指示无法完成它的情况,并且需要一段时间才能到达,但是您希望遵循线程中断.这样的事情就足够了

private double improveUpon(double start) {
  // ...
}


public double compute() throws InterruptedException {
  final Thread current = Thread.currentThread();
  double result = 0.0;
  do {
    if (current.interrupted())
      throw new InterruptedException();
    result = improveUpon(result);
  } while (!isAdequate(result));
  return result;
}

请注意,我们调用Thread#interrup(),它具有清除线程的中断状态(如果已设置)的副作用.如果该方法返回true,那么我们作为调用者已经接受了保存和传达该中断状态的责任.在这种情况下,由于我们不假设我们创建了调用线程,我们没有足够的可见范围来了解它的中断策略,所以我们通过抛出InterruptedException来传达我们观察和采用的中断状态.

将方法标记为“阻塞”总是一个程度的问题;每个方法阻塞其呼叫者一段时间.您可能正在寻找的区别是方法是否阻止等待某些外部输入,例如用户按键或通过网络到达的消息.在这种情况下,您抛出InterruptedException的广告向您的呼叫者表明,您的方法可以安全地使用线程的呼叫者来控制其延迟.你在说,“这可能需要一段时间才能完成,但这不会比你愿意等待.”你在说,“我会跑,直到你告诉我不要.这与例如java.io.InputStream#read()有所不同,即在三种情况发生之前就有可能阻止,否则呼叫者的线程不会被中断.

在大多数情况下,您的决定是为了回答以下问题:

>为了满足我的方法的要求,我需要调用抛出InterruptedException的任何方法吗?
>如果是这样,我已经完成了对我的呼叫者的任何使用的工作?
>如果没有,我也应该抛出InterruptedException.
>如果没有我调用throws InterruptedException,我应该尊重我的调用线程的中断状态?
>如果是这样,是否已经完成了任何工作,我发现我已经打扰了我的来电者的任何用途?
>如果没有,我应该抛出InterruptedException.

一个人检测到当前线程中断并吞下的情况通常仅限于您作者创建有问题的线程的情况,并且一旦线程中断,您就已经致力于退出线程的run()方法.这是“合作取消”的概念,您可以观察到您的线程停止运行的请求,并且您决定遵守该请求,尽快完成您的工作,并让线程的调用堆栈展开.再次,除非你是线程的run()方法的作者,否则你吞噬线程的中断状态可能会损害调用者和他们调用的其他方法的预期行为.

我建议你研究一个线程的中断状态的主题,并且使用方法Thread#isInterrupted(),Thread#interrupted()Thread#interrupt().一旦理解了这些,并且看到正在运行的InterruptedException是Thread#isInterrupted()的替代表示返回true或者线程#interrup()的有礼貌的翻译已经返回true,这一切都应该开始变得更有意义了.

如果您需要更多的学习实例,请说出来,我可以在这里添加建议.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 目录 连接 连接池产生原因 连接池实现原理 小结 TEMPERANCE:Eat not to dullness;drink not to elevation.节制
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 一个优秀的工程师和一个普通的工程师的区别,不是满天飞的架构图,他的功底体现在所写的每一行代码上。-- 毕玄 1. 命名风格 【书摘】类名用 UpperCamelC
今天犯了个错:“接口变动,伤筋动骨,除非你确定只有你一个人在用”。哪怕只是throw了一个新的Exception。哈哈,这是我犯的错误。一、接口和抽象类类,即一个对象。先抽象类,就是抽象出类的基础部分,即抽象基类(抽象类)。官方定义让人费解,但是记忆方法是也不错的 —包含抽象方法的类叫做抽象类。接口
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket一、引子文件,作为常见的数据源。关于操作文件的字节流就是 —FileInputStream&FileOutputStream。
作者:泥沙砖瓦浆木匠网站:http://blog.csdn.net/jeffli1993个人签名:打算起手不凡写出鸿篇巨作的人,往往坚持不了完成第一章节。交流QQ群:【编程之美 365234583】http://qm.qq.com/cgi-bin/qm/qr?k=FhFAoaWwjP29_Aonqz
本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程与多线程 线程是什么? 线程(Thread)是一个对象(Object)。用来干什么?Java 线程(也称 JVM 线程)是 Java 进程内允许多个同时进行的任务。该进程内并发的任务成为线程(Thread),一个进程里至少一个线程。 Ja
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket在面向对象编程中,编程人员应该在意“资源”。比如?1String hello = "hello"; 在代码中,我们
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第103篇原创 《程序兵法:Java String 源码的排序算法(一)》 文章工程:* JDK 1.8* 工程名:algorithm-core-le
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 目录 一、父子类变量名相同会咋样? 有个小故事,今天群里面有个人问下面如图输出什么? 我回答:60。但这是错的,答案结果是 40 。我知错能改,然后说了下父子类变
作者:泥瓦匠 出处:https://www.bysocket.com/2021-10-26/mac-create-files-from-the-root-directory.html Mac 操作系统挺适合开发者进行写代码,最近碰到了一个问题,问题是如何在 macOS 根目录创建文件夹。不同的 ma
作者:李强强上一篇,泥瓦匠基础地讲了下Java I/O : Bit Operation 位运算。这一讲,泥瓦匠带你走进Java中的进制详解。一、引子在Java世界里,99%的工作都是处理这高层。那么二进制,字节码这些会在哪里用到呢?自问自答:在跨平台的时候,就凸显神功了。比如说文件读写,数据通信,还
1 线程中断 1.1 什么是线程中断? 线程中断是线程的标志位属性。而不是真正终止线程,和线程的状态无关。线程中断过程表示一个运行中的线程,通过其他线程调用了该线程的 方法,使得该线程中断标志位属性改变。 深入思考下,线程中断不是去中断了线程,恰恰是用来通知该线程应该被中断了。具体是一个标志位属性,
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocketReprint it anywhere u want需求 项目在设计表的时候,要处理并发多的一些数据,类似订单号不能重复,要保持唯一。原本以为来个时间戳,精确到毫秒应该不错了。后来觉得是错了,测试环境下很多一
纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群 纯技术交流群 每日推荐 - 技术干货推送 跟着泥瓦匠,一起问答交流 扫一扫,我邀请你入群 加微信:bysocket01
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocketReprint it anywhere u want.文章Points:1、介绍RESTful架构风格2、Spring配置CXF3、三层初设计,实现WebService接口层4、撰写HTTPClient 客户
Writer :BYSocket(泥沙砖瓦浆木匠)什么是回调?今天傻傻地截了张图问了下,然后被陈大牛回答道“就一个回调…”。此时千万个草泥马飞奔而过(逃哈哈,看着源码,享受着这种回调在代码上的作用,真是美哉。不妨总结总结。一、什么是回调回调,回调。要先有调用,才有调用者和被调用者之间的回调。所以在百
Writer :BYSocket(泥沙砖瓦浆木匠)一、什么大小端?大小端在计算机业界,Endian表示数据在存储器中的存放顺序。百度百科如下叙述之:大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加
What is a programming language? Before introducing compilation and decompilation, let's briefly introduce the Programming Language. Programming la
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:BYSocketFaceBook:BYSocketTwitter :BYSocket泥瓦匠喜欢Java,文章总是扯扯Java。 I/O 基础,就是二进制,也就是Bit。一、Bit与二进制什么是Bit(位)呢?位是CPU
Writer:BYSocket(泥沙砖瓦浆木匠)微博:BYSocket豆瓣:BYSocket一、前言 泥瓦匠最近被项目搞的天昏地暗。发现有些要给自己一些目标,关于技术的目标:专注很重要。专注Java 基础 + H5(学习) 其他操作系统,算法,数据结构当成课外书博览。有时候,就是那样你越是专注方面越