抛出InterruptedException

抛出InterruptedException

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

10-11 00:24