当前位置: 首页 > 知识库问答 >
问题:

清除线程的方法。中断()标志

相俊迈
2023-03-14

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

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

目前我知道以下操作将清除中断标志:

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

我还缺什么?非常感谢。

共有3个答案

穆丁雨
2023-03-14

这里有一个非常有趣的例子:

信道qos。返回日志。果心版本1.1.4之前的AsyncAppenderBase捕获并接受InterruptedException,而不重置线程上的标志。

所以,如果你使用任何路由到这个记录器的东西(比如slf4j),它会默默地吃掉你的线程中断状态。因为,我的意思是,谁不在每个可能的日志操作前后检查线程中断状态?

桑博远
2023-03-14

常见的约定如下:任何抛出中断异常(Thread.interrupted())的方法都会清除中断标志。

因此,为了使线程具有可中断性,您需要找到所有捕获到中断异常的位置,而无需追溯它或恢复中断标志。因为InterruptedException是一个选中的异常,所以不难做到。

楮自珍
2023-03-14

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

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

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

因此,线程。currentThread()。应始终使用isInterrupted()。

以下方法将通过立即抛出InterruptedException来清除中断的标志,如果它们被调用然后线程被中断,或者如果线程已经被中断然后它们被调用(请参阅下面的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(...)

请注意,捕获中断异常(InterruptedException)的任何代码的正确模式是立即重新中断线程。我们这样做是为了防止其他人依赖于线程。isInterrupted()方法:

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());
 类似资料:
  • 问题内容: 我最近继承了一个大型Java应用程序,其中几乎没有线程安全性。我目前正在做的是让所有线程正确处理被中断,而不是使用非常糟糕的线程。 问题的部分原因是,我不知道在那里清除中断标志的每个方法调用。 目前,我知道以下内容将清除中断标志: 我还想念什么?谢谢 问题答案: 问题的部分原因是,我不知道在那里清除中断标志的每个方法调用。 重要的是要阐明以下方法仅通过调用它们来清除中断标志: 因此,应

  • 本文向大家介绍Android中断线程的处理方法,包括了Android中断线程的处理方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Android中断线程的处理方法。分享给大家供大家参考。具体方法如下: 我现在对一个用户注册的功能 1.用ProgressDialog将当前页面设成不可操作(保留返回键 退出ProgressDialog) 2.用一个线程clientThread执行数据的提交

  • 我正在阅读这篇文章,关于从一个线程中断另一个线程的建议是 “”“如果正确实施,以下几种方法应该可以奏效。 您可以让两个线程定期检查一些常见的标志变量(例如,将其称为stopNow),并安排两个线程在完成时进行设置。(标志变量需要是volatile…或正确同步的。) 您可以让两个线程定期调用线程。isInterrupted()方法,查看它是否已被中断。然后每个线程都需要调用线程。完成后,在另一个上中

  • 标记-清除是主流的追踪式收集算法的一种,和引用计数相比,追踪式收集是一种间接方法,与程序耦合性很低,简单地说,就是程序在需要的时候只管申请内存,使用时也不用像引用计数机制要做实时地维护,直到一定条件(一般是已申请内存空间达到一定阈值),进程暂停执行,由垃圾收集器回收垃圾,然后继续执行,当然如果收集之后还是内存不足,就报错。很多语言的主流实现都使用追踪式收集,比如java,C#等 追踪式收集严格按照

  • 本文向大家介绍bootstrap清除浮动的方法?相关面试题,主要包含被问及bootstrap清除浮动的方法?时的应答技巧和注意事项,需要的朋友参考一下 :after伪类在元素末尾插入了一个包含空格的字符,并设置display为table display:table会创建一个匿名的table-cell,从而触发块级上下文(BFC),因为容器内float的元素也是BFC,由于BFC有不能互相重叠的特性

  • 本文向大家介绍PHP清除字符串中所有无用标签的方法,包括了PHP清除字符串中所有无用标签的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP清除字符串中所有无用标签的方法。分享给大家供大家参考。具体实现方法如下: 很多时候需要输出一些 “纯” 字符串,也就是去除任何杂质,例如 Html 标签、空格之类的文本,输出的摘要就是如此,下面的这个函数可以帮你实现着一点. PHP实例代码如下