清除 Thread.interrupt() 标志的方法

2024-03-24

我最近继承了一个大型Java应用程序,其中几乎没有线程安全性。我目前正在研究的是让所有线程正确处理被中断的情况,而不是使用非常糟糕的线程Thread.stop().

部分问题是我不知道清除中断标志的每个方法调用。

目前我知道以下内容将清除中断标志:

Thread.interrupted()
Thread.sleep(long)
Thread.join()
Thread.join(long)
Object.wait()
Object.wait(long)

我还缺少什么?谢谢


部分问题是我不知道清除中断标志的每个方法调用。

需要澄清的是,以下方法只需调用它们即可清除中断标志:

Thread.interrupted()
Thread.isInterrupted(true) -- added to your list

为此原因Thread.currentThread().isInterrupted()应始终使用。

以下方法将清除中断标志立即地投掷InterruptedException或者如果它们被调用然后线程被中断or如果线程是already被中断,然后它们被调用(参见下面的 junit 代码)。所以不是清除标志的方法,而是抛出异常。

您的初始清单:

Thread.interrupted()
Thread.sleep(long)
Thread.join()
Thread.join(long)
Object.wait()
Object.wait(long)

添加到您的列表:

Thread.sleep(long, int)
Thread.join(int, long)
Thread.isInterrupted(true)
Object.wait(int, long)
BlockingQueue.put(...)
BlockingQueue.offer(...)
BlockingQueue.take(...)
BlockingQueue.poll(...)
Future.get(...)
Process.waitFor()
ExecutorService.invokeAll(...)
ExecutorService.invokeAny(...)
ExecutorService.awaitTermination(...)
CompletionService.poll(...)
CompletionService.take(...)
CountDownLatch.await(...)
CyclicBarrier.await(...)
Semaphore.acquire(...)
Semaphore.tryAcquire(...)
Lock.lockInteruptibly()
Lock.tryLock(...)

请注意正确的模式与any捕获的代码InterruptedException就是立即重新中断线程。我们这样做是为了防止其他人依赖thread.isInterrupted() method:

try {
    ...
} catch (InterruptedException e) {
    // immediately re-interrupt the thread
    Thread.currentThread().interrupt();
    // log the exception or [likely] quit the thread
}

JUnit 代码演示了其中一些内容:

assertFalse(Thread.currentThread().isInterrupted());
// you can do this from another thread by saying: someThread.interrupt();
Thread.currentThread().interrupt();
// this method does _not_ clear the interrupt flag
assertTrue(Thread.currentThread().isInterrupted());
// but this one _does_ and should probably not be used
assertTrue(Thread.interrupted());
assertFalse(Thread.currentThread().isInterrupted());
Thread.currentThread().interrupt();
assertTrue(Thread.currentThread().isInterrupted());
try {
    // this throws immediately because the thread is _already_ interrupted
    Thread.sleep(1);
    fail("will never get here");
} catch (InterruptedException e) {
    // and when the InterruptedException is throw, it clears the interrupt
    assertFalse(Thread.currentThread().isInterrupted());
    // we should re-interrupt the thread so other code can use interrupt status
    Thread.currentThread().interrupt();
}
assertTrue(Thread.currentThread().isInterrupted());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

清除 Thread.interrupt() 标志的方法 的相关文章

  • 谁能解释一下 servlet 映射吗?

    我正在尝试使用 SpringMVC 编写一个 Web 应用程序 通常我只是将一些虚构的文件扩展名映射到 Spring 的前端控制器并快乐地生活 但这次我要使用类似 REST 的 URL 没有文件扩展名 将我的上下文路径下的所有内容映射到前端
  • Selenium webdriver :列表不是通用的;它不能使用参数 `` 类型进行参数化

    我试图将链接存储在列表中 请按照以下代码操作 public class frameswitch public static void main String args System setProperty webdriver gecko d
  • java.lang.NoClassDefFoundError:HttpSessionListener

    我正在尝试部署一场我没有编写的战争 但我在日志中收到此错误 java lang NoClassDefFoundError HttpSessionListener 我知道 HttpSessionListener 位于servlet api j
  • Jackson Json 将对象反序列化为列表

    我正在使用 Spring 的 Web 服务RestTemplate并反序列化Jackson 在来自服务器的 JSON 响应中 其中一个字段可以是对象或列表 这意味着它可以是 result or result 有没有办法通过对我要反序列化的类
  • WaitForSingleObject 是否充当内存屏障?

    昨天一个关于双重检查锁定的问题引发了一系列的想法 让我对一个简单的情况感到不确定 在下面的代码中 是否可以点击printf 不再同步 在这个简单的示例中 这些值可能位于同一缓存行上 因此我认为这种可能性较小 假设一开始可能性 gt 0 如果
  • 文件保存在文件系统中 VS 保存在数据库中

    我正在设计一个 servlet 或 Struts2 中的操作 用于文件 图像 文档等 下载 但我想知道哪种更好的方法可以将文件保留在文件系统和数据库中 只需保留文件的路径或将文件保留在数据库中 如 BLOB 我知道当我查询数据库时 哪里的
  • 在 JSP 中对表单操作使用相对路径

    如何在表单操作中使用相对路径
  • Java 将字节转换为二进制安全字符串

    我有一些以字节为单位的数据 我想将它们放入Redis中 但是Redis只接受二进制安全字符串 而我的数据有一些二进制非安全字节 那么如何将这些字节转换为二进制安全字符串以便将它们保存到 Redis 中呢 Base64 对我有用 但它使数据更
  • (Java) 在 Mac OS X 上以编程方式访问“系统根目录”下的 SSL 证书

    我正在编写一个 Java 应用程序 它可以通过远程 Https 站点进行 REST Api 调用 远程站点由受信任的证书签名 它在 Windows 上运行良好 但由于 SSL 证书问题 在 OS X 上运行时遇到问题 我做了一些挖掘 发现原
  • org.hibernate.MappingException:没有 JDBC 类型的方言映射:1111

    我使用的是 postgres v8 3 它的列类型为 XML DDL 看起来像这样 CREATE TABLE contact ID INTEGER NOT NULL NAME VARCHAR NOT NULL Details XML 在映射
  • 如何将 wsdl 内部架构设置为 Jaxb2Marshaller 以验证我所做的每篇文章?

    我正在使用 SOAP Web 服务 在调用它之前我必须验证每个 xml 帖子 所以我正在使用 The CXF codegen 插件生成POJO树结构 第三部分 wsdl xxxx soap service wsdl 一个类实现Web服务网关
  • Spring @Value 添加验证小于

    我使用以下属性值注入 我如何向此操作添加小于验证 我的意思是我想设置一个验证user maxpassiveday可以说 财产价值不得低于 100 Value user maxpassiveday int maxpassiveday 使用Sp
  • 单线程公寓问题

    从我的主窗体中 我调用以下命令来打开一个新窗体 MyForm sth new MyForm sth show 一切都很好 但是这个表单有一个组合框 当我将其 AutoCompleteMode 切换为建议和追加时 我在显示表单时遇到了这个异常
  • 如何使用 UUID 生成唯一的正 Long

    我需要为我的数据库主键列生成唯一的长 ID 我以为我可以用UUID randomUUID getMostSignificantBits 但有时它也会产生一些负多头 这对我来说是个问题 是否可以从 UUID 中仅生成正长 将会有数十亿个条目
  • 使用antlr4获取预处理器行并解析C代码

    我正在使用 Antlr4 来解析 C 代码 并使用以下语法来解析 链接到 C g4 https github com antlr grammars v4 blob master c C g4 上面的语法默认不提供任何解析规则来获取预处理器语
  • JSP 作为电子邮件模板

    有没有办法发送 MIME 电子邮件 其中电子邮件正文源自 JSP 我需要使用 Javamail 发送一封电子邮件 其中包含一个表格 我认为如果我可以使用 JSP 来完成所有格式设置和布局 将会很方便 在这个线程中 Java 电子邮件模板的建
  • 从 C 线程调用 Python 代码

    我对从 C 或 C 线程调用 Python 代码时如何确保线程安全感到非常困惑 The Python 文档 http docs python org c api init html non python created threads似乎是
  • 如何确保超类的子类方法的线程安全?

    我参加了一次面试 并被要求为以下要求设计一个课程 假设我有一个 A 类 它可以有任意数量的子类 即子类 类 A 有一个名为 doSomething 的方法 该方法是同步的 要求是 A 的所有子类都是强制性的重写 doSomething me
  • RecyclerView 适配器的 Kotlin 泛型

    我正在尝试编写一个通用的 recyclerview 适配器 我找到了几个例子 然而 仍然无法弄清楚如何实现通用适配器 我写的代码是 open abstract class BaseAdapter
  • 对 Java 协议缓冲区对象进行一些小更改

    我想在 Java 协议缓冲区对象树的深处进行一个小更改 我可以使用 getBuilder 方法来创建一个新对象 该新对象是旧对象的克隆并进行一些更改 当深入完成此操作时 代码会变得丑陋 Quux Builder quuxBuilder fo

随机推荐

  • Scala self 类型和集合中的 this.type 问题

    我试图理解 scala 中抽象和显式的自我类型 让我们考虑这个例子 我想为可扩展树创建一个基础 就像这样简单 trait Tree def children Iterable Tree def descendants Iterable Tr
  • 如何在 Fluent NHibernate 中将“级联删除”选项设置为“设置空”?

    我是 Fluent nHibernate 的新手 想知道 如果我有两个类 Profile 和 Email 一对多映射 如下所示 我想流畅地定义一个 nHibernate 映射 这样当 Profile 被删除时 Email 将保留在DB 键设
  • 从 Android 加速度计获取倾斜角度

    我有一个实现的类SensorEventListener我想得到 这tilt Angle我的设备使用Accelerometer 我在互联网上寻找示例 但他们使用Sensor TYPE MAGNETIC FIELD 我相信我的设备没有这个传感器
  • 我解释 DI 和 IoC 的方式有什么问题?

    昨天在一次采访中我被问到春季的 DI 和 IoC 是什么 我的回复是 when a class A 延伸摘要class B 或实施interface B 或创建一个对象class B 其中任何一个类 那么A据说是 依赖于B 注入这个依赖关系
  • winforms:使用parallel.foreach更新进度

    我没有看到任何与我的问题相关的帖子 因此 如果我发布已经提出的问题 我深表歉意 我有一个 Windows 窗体程序 C 用于检查股票并进行分析 主窗体通过新线程和 ShowDialog 启动另一个窗体 当它加载时 它正在运行parallel
  • Spring ThreadPoolTask​​Executor 的工作原理

    我一直在阅读 Spring 的 ThreadPoolTask Executor 的设置如何协同工作以及线程池和队列如何工作 This https stackoverflow com a 43874563 10727434stackoverf
  • 如何在 swift 中向我的 cocoa 应用程序添加设置?

    我对 Swift 编程还很陌生 我想知道是否有一种简单的方法可以在 Swift 中向我的 Cocoa 应用程序添加设置 首选项 如果可能的话 我想要一份分步指南 我主要想知道如何将用户的首选项存储在磁盘和代码部分上 在我当前的代码中 它将需
  • .NET 多个类库合二为一

    我在VS2008中工作 我有一个自定义类库 CL1 它引用另一个自定义类库 CL2 最终我的发布文件夹中包含了 CL1 和 CL2 现在 CL1 的使用者需要在项目中包含两个 dll 我认为这是不合适的 我强烈地感觉到必须有一种方法来实现单
  • 在用户接受同意之前暂时禁用 Firebase 的所有服务

    我有一个实施了 Firebase 的应用程序 我想要的是在用户接受数据收集同意之前禁用与 Firebase 相关的所有内容 在 android 文档中 我看到 例如 我可以使用以下方法禁用 Firebase Analytics setAna
  • 该字段泄漏上下文对象

    我在非 Activity 中使用 Context 对象 它工作正常 但问题是它显示警告 That is where I am using the context object Here is the result of inspection
  • 如何在 JDBC url 中正确传递会话变量?

    我必须增加group concat max len 我无法通过preparestatement 做到这一点 而且我也无法在mysql my conf 文件中做到这一点 我在 mysql 文档中发现有一个选项可以在 url 中传递会话变量 但
  • Python argparse 字典 arg

    我想收到一个dict str gt str 来自命令行的参数 做argparse ArgumentParser提供吗 或者还有其他图书馆吗 对于命令行 program py dict d key key1 value val1 key ke
  • 为什么

    编辑 另请参阅下面我自己的答案 2016 例如 ul li class first a href title Home a li li a href title Chi siamo a ul li a href title item1 a
  • 动态调用DLL中的方法

    我有一个包含一些方法 显示 隐藏和验证 的 DLL 这是其中一种方法的示例hide Panel paneldynamic String id List
  • Angular - routerLink 和状态问题

    我想使用 routerLink 和状态从 html 页面路由到另一个页面 使用标签没有问题 在登陆页面的 ngOnInit 期间 我可以按预期检索状态 使用标签主页也可以导航 但状态结果未定义 我有什么错吗 登录页面的html
  • 无法加载此类文件--2.2/gherkin_lexer_en,如何修复?

    我需要一点帮助 我该如何解决这个问题 当我打电话时cucumber我收到以下错误 WARNING You must use ANSICON 1 31 or higher https github com adoxa ansic on to
  • 目前仅在 PRIMARY KEY 的聚集列上支持排序依据

    卡桑德拉2 0 7 cql 3 1 1 CREATE TABLE playlists id uuid song order int song id uuid title text album text artist text PRIMARY
  • 如何为 has_many_polymorphs 和错误设置这些 CRUD 控制器操作

    我正在使用有很多多态性 https github com fauna has many polymorphs插件 以便可以将视频 主题和用户发布到个人资料中 因此 一个个人资料有很多 showable objects 可以是视频 主题和用户
  • 使用 microsoft graph c# asp.net 将新文件上传到 onedrive

    尝试将尚不存在的文件上传到 onedrive 我已经设法让它更新现有文件 但似乎无法弄清楚如何创建一个全新的文件 我已经使用以下方法完成了此操作Microsoft Graph图书馆 以下是用于更新现有文件的代码 public async T
  • 清除 Thread.interrupt() 标志的方法

    我最近继承了一个大型Java应用程序 其中几乎没有线程安全性 我目前正在研究的是让所有线程正确处理被中断的情况 而不是使用非常糟糕的线程Thread stop 部分问题是我不知道清除中断标志的每个方法调用 目前我知道以下内容将清除中断标志