gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 21:04:21 27 4
gpt4 key购买 nike

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

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

目前我知道以下会清除中断标志:

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

我还缺少什么?谢谢

最佳答案

Part of the problem has been that I do not know every method call out there that clears the interrupt flag.

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

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

因此,应始终使用 Thread.currentThread().isInterrupted()

以下方法将通过立即清除中断标志,如果它们被调用然后线程被中断线程已经被中断,然后它们被调用(见下面的junit代码)。所以不是清除标志的方法,而是抛出异常。

您的初始 list :

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任何 代码的正确模式是立即重新中断线程。我们这样做是为了防止其他人依赖 thread.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 - 清除 Thread.interrupt() 标志的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10401947/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com