0

我有一个监视器的java实现,使用

java.util.concurrent.locks.Lock;
java.util.concurrent.locks.ReentrantLock;
java.util.concurrent.locks.Condition;

我要解决的问题是读者/作者问题。我有一个锁lock和两个条件readerswriters

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

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

readers.await()当有写入文件的写入者/有写入文件的写入者等待写入文件时调用。

writers.await()当有一个或多个读取器从文件读取或写入器当前正在写入文件时调用。

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

4

1 回答 1

0

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

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

LockSupport.park(对象拦截器);(-> sun.misc.Unsafe.park(boolean bln, long l) 用于热点)。像这样的东西:

    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,最好为当前线程设置“被中断”标志:

    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-

于 2014-02-18T15:51:39.533 回答