【问题标题】:await method of class Condition not throwing InterruptedExceptionCondition类的await方法不抛出InterruptedException
【发布时间】:2011-11-30 16:51:27
【问题描述】:

Java SE 6 中 Condition 类的 await 方法有一个奇怪的问题。 问题是 await 方法在被另一个线程中断时并不总是抛出异常。

在文档中写到 IE 在以下情况下被抛出:

... 其他一些线程中断当前线程,支持中断线程挂起 ...

如何解释这个分句:“并且支持线程挂起的中断”

不抛出异常似乎是不可能的。 你有过类似的问题吗?

【问题讨论】:

    标签: java multithreading java.util.concurrent concurrency interrupted-exception


    【解决方案1】:

    如果对象通过signalsignalAll API 接收到信号,不抛出InterruptedException 并非不可能,规范说这两种方法将唤醒任何在这种情况下等待的线程。

    【讨论】:

    • 很明显,我说的是只是关于中断而不是信号。
    【解决方案2】:

    我有一个类似的问题,有一个线程在等待一个条件:

    Lock someLock = new ReentrantLock();
    Condition someCondition = someLock.newCondition();
    ...
    someCondition.await(timeout, TimeUnit.MILLISECONDS);
    

    并发送 theThread.interrupt() 不起作用。事实证明,另一个线程错误地持有 someLock 锁定,因此 await() 被阻止。在我在适当的位置添加someLock.unlock() 之后,await() 开始按预期抛出 InterruptedException。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多