我有一个使用
的监视器的java实现java.util.concurrent.locks.Lock;
java.util.concurrent.locks.ReentrantLock;
java.util.concurrent.locks.Condition;
我正在解决的问题是读者/作者问题。我有一把锁lock
&两个条件readers
和writers
。
我注意到Condition.await()
函数抛出了InterruptedException
。现在,我刚刚使用try / catch块包围了该方法。但是,catch块是空的。
我想知道什么时候抛出这个异常以及我应该如何处理它。
当有一个写入器写入文件/有写入者等待写入文件时,会调用 readers.await()
。
writers.await()
。
在什么情况下会抛出InterruptedException,我应该如何处理它们?
答案 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-