- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 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
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/
场景如下。 我实现了一个这样的界面: public interface MessageSourceProvider { MessageSource getMessageSource(Local
这个问题已经有答案了: I want my thread to handle interruption, but I can't catch InterruptedException because
这段代码应该可以编译,不是吗?我究竟做错了什么?我希望代码在显示数组中的每个数字之前短暂暂停。 public static void median(int odd[]) throws Interrup
我正在学习 Java 并发,并尝试了 Java 教程中的示例,并进行了一些实验( try catch 异常)。 public class SleepMessages { public stat
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: Handling InterruptedException in Java 我想知道如何InterruptedExc
这个问题已经有答案了: Handling InterruptedException in Java (7 个回答) 已关闭 6 年前。 我有课 class Foo { static void
我有两个同步适配器,我希望每个同步适配器都等到另一个同步适配器完成后再开始执行。我对信号量使用了以下技术: public class SyncerOne extends AbstractThreade
Given code is working in doInBackground(). Where while loop is always true but i don't know how it c
我有一个以 LinkedBlockingQueue 作为属性的类 A。在 A 的一种方法中,我调用了 LinkedBlockingQueue.put() 方法,因为我想在队列中插入一个项目。但是,如果
我对 Java SE 6 中 Condition 类的 await 方法有一个奇怪的问题。问题是 await 方法在被另一个线程中断时并不总是抛出异常。 在文档中写到在以下情况下会抛出 IE: ...
我很困惑,无法理解为什么不应该吞下 InterruptedException。 IBM 的文章说 当阻塞方法检测到中断并抛出 InterruptedException 时,它会清除中断状态。如果您捕捉
我正在阅读 kathy sierra SCJP 1.5 第 9 章(线程),其中提到: Notice that the sleep() method can throw a checked Inter
我一直在同步块(synchronized block)内收到此异常,在同步块(synchronized block)中我对同步的同一个对象调用等待。一个线程首先被中断是什么意思?其次,发生这种情况的正
对于任何 Java 大师来说,这应该是一个简单的练习。我是新手,只是想确认一件事。 我有一个实现 Runnable 的类,与许多此类类一样,它的 run() 方法有一个无限循环。我想做一些任务,然后睡
我有以下方法,效果很好。我正在尝试测试抛出 InterruptedException 的场景。这就是我目前正在测试的方式,如果我只运行这个单一测试,它会起作用。但是如果我要在我的测试类中运行所有剩余的
我偶然发现了一种情况,我必须处理 InterruptedException,但无法将其向上传递并且不认为我的代码应该被允许吞下它。准确地说,我正在研究分布式锁实现,并且对支持服务的请求可能会中断甚至超
我正在尝试编写一个程序,其中每个类都有单独的类和方法,交叉调用其他类的方法。下面是我想从另一个类的另一个方法调用的编码方法。 public class walk{ public void wa
我有一个 vaadin 应用程序,它使用 hibernate 并在 glassfish 中上传,我们收到此错误: AdmissionWeb:2018-07-03 12:01:06 [WARN ][ht
我有代码,需要等待一段时间作为繁忙等待的一部分(由于遗留代码,我无法更改那么多)。我已经阅读了为什么我应该在此处执行此操作的推理 [1] 和 [2],并且它是显而易见的经验法则。经常这样做。 IIUC
我有这段代码。如果在等待添加到队列时被中断,LinkedBlockingQueue 应该仅抛出 Exception。但这个队列是无限的,所以它应该尽快添加。为什么我的关闭方法会抛出 Interrupt
我是一名优秀的程序员,十分优秀!