Java监视器 - 捕获InterruptedException

时间:2013-10-17 21:10:01

标签: java interrupt monitor java.util.concurrent interrupted-exception

我有一个使用

的监视器的java实现
java.util.concurrent.locks.Lock;
java.util.concurrent.locks.ReentrantLock;
java.util.concurrent.locks.Condition;

我正在解决的问题是读者/作者问题。我有一把锁lock&两个条件readerswriters

我注意到Condition.await()函数抛出了InterruptedException。现在,我刚刚使用try / catch块包围了该方法。但是,catch块是空的。

我想知道什么时候抛出这个异常以及我应该如何处理它。

当有一个写入器写入文件/有写入者等待写入文件时,会调用

readers.await()

当有一个或多个读者从文件读取或者作者当前正在写入文件时,会调用

writers.await()

在什么情况下会抛出InterruptedException,我应该如何处理它们?

1 个答案:

答案 0 :(得分:0)

中断允许在线程的上下文中停止一些长/阻塞任务。 InterruptedException仅在某人为给定线程设置了“is interrupted”标志时才会发生。

现在关于await()。当您的线程A在Condition.await()上等待时,通常这意味着它被

停放

LockSupport.park(Object blocker); ( - > sun.misc.Unsafe.park(boolean bln,long l)for Hotspot)。像这样:

    public void await() throws InterruptedException {
        if (Thread.interrupted()) {
            throw new InterruptedException();
        }

        while (still_waiting) {
            LockSupport.park(this);
            if (Thread.interrupted()) {
                throw new InterruptedException();
            }
        }
    }

现在让我们假设用户停止了应用程序。主线程调用A.interrupt()来完成你的线程A. interrupt()在本机Thread.interrupt0()中实现。此调用设置线程的“中断”标志并取消停放线程A,并且线程看到它被中断并抛出InterruptedException。

这取决于系统要求如何捕获InterruptedException。如果你的线程在循环中做了一些工作,你应该打破循环让线程完成。此外,如果您刚捕获InterruptedException,最好为当前线程设置“is interrupted”标志:

    try {
         ...
         some.await();
     }
     catch (InterruptedException e) { 
         // Restore the interrupted status
         Thread.currentThread().interrupt();
     }

一篇陈旧但仍然很好的文章:http://www.ibm.com/developerworks/java/library/j-jtp05236/index.html?ca=drs-