我正在使用Java 1.8 java.util.concurrent.LinkedBlockingQueue
,当我打电话时:
LinkedBlockingQueue.poll(5000, TimeUnit.MILLISECONDS)
偶尔会抛出
InterruptedException
:java.lang.InterruptedException
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.reportInterruptAfterWait(AbstractQueuedSynchronizer.java:2014)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2088)
at java.util.concurrent.LinkedBlockingQueue.poll(LinkedBlockingQueue.java:467)
我认为这是发生的,因为在对
checkInterruptWhileWaiting() at AbstractQueuedSynchronizer:2079
的(间接)调用中,以下代码返回trueUnsafe.compareAndSwapInt(...)
另外,
Unsafe.compareAndSwapInt
返回boolean
,但是boolean
是什么意思呢?我找不到有关该类/功能的任何文档。我怀疑另一个线程中正在发生某种情况导致此问题,但是我不确定现在应该在哪里寻找。
任何有助于理解为什么会抛出
InterruptedException
的帮助都将非常有帮助。我真的很想能够在一个小的测试程序中重现它,但是现在它在一个大的杂乱程序中,因此我试图了解导致此问题的原因,以便我可以创建一个测试程序来重现它。 最佳答案
您的应用中是否还有其他线程调用Thread.interrupt()
?这就是awaitInNanos()
中发生的事情:
if (Thread.interrupted())
throw new InterruptedException();
如果控制线程,则可以覆盖
interrupt
方法,仅用于测试: Thread thread = new Thread() {
@Override
public void run() {
// do something longrunning
}
@Override
public void interrupt() {
// try-finally ensures to run both super.interrupt() and the deubg code
try {
super.interrupt();
} finally {
// you can use any logging services that you already have
System.out.println("--> Interrupted from thread: " + Thread.currentThread().getName());
Thread.dumpStack();
}
}
};
如果手动创建线程,则可以覆盖
interrupt()
。如果使用执行程序,则可以提供 ThreadFactory
,它使用正确的interrupt()
方法创建线程。这是使用此调试技术的
main()
方法。请注意,您需要在STDIN
中输入一行或手动终止该过程。否则它将永远运行(jvm重新启动)。public static void main(String[] args) {
Thread thread = new Thread() {
@Override
public void run() {
System.out.println("--> asdf");
try (BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) {
br.readLine();
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
@Override
public void interrupt() {
// try-finally ensures to run both super.interrupt() and the deubg code
try {
super.interrupt();
} finally {
// you can use any logging services that you already have
System.out.println("--> Interrupted from thread: " + Thread.currentThread().getName());
Thread.dumpStack();
}
}
};
thread.start();
System.out.println("--> before interrupt");
thread.interrupt();
System.out.println("--> after interrupt");
}
关于java - LinkedBlockingQueue.poll(...)偶尔抛出InterruptedException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49661645/