gpt4 book ai didi

java - LinkedBlockingQueue.poll(...) 偶尔抛出 InterruptedException

转载 作者:行者123 更新时间:2023-11-30 10:17:36 25 4
gpt4 key购买 nike

我正在使用 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

期间返回 true
Unsafe.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/

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