如果semaphore.acquire()得到InterruptedException,需要semaphore.relase()吗?

Ern*_*nie 11 java semaphore interrupted-exception

从Java java.util.concurrent.Semaphore文档中我不太清楚,如果semaphore.acquire()阻塞线程并且之后被InterruptedException中断,会发生什么.信号量值是否已降低,是否需要释放信号量?

目前我使用的代码如下:

try {
  // use semaphore to limit number of parallel threads
  semaphore.acquire();
  doMyWork();
}
finally {
  semaphore.release();
}
Run Code Online (Sandbox Code Playgroud)

或者我应该在acquire()期间发生InterruptedException时不要调用release()?

nos*_*nos 12

在acquire()期间发生InterruptedException时调用release()?

你不应该.如果.acquire()被中断,则不会获取信号量,因此很可能不会释放它.

你的代码应该是

// use semaphore to limit number of parallel threads
semaphore.acquire();
try {
  doMyWork();
}
finally {
  semaphore.release();
}
Run Code Online (Sandbox Code Playgroud)

  • 这个问题是semaphore.acquire()也会抛出InterruptedException. (5认同)

jbl*_*ack 6

nos 接受的答案是部分正确的,除了 semaphore.acquire() 也会抛出 InterruptedException。因此,要 100% 正确,代码将如下所示:

try {
    semaphore.acquire();
    try {
        doMyWork();
    } catch (InterruptedException e) { 
        // do something, if you wish
    } finally {
        semaphore.release();
    }
} catch (InterruptedException e) {
    // do something, if you wish
}
Run Code Online (Sandbox Code Playgroud)

  • `doMyWork()` 想抛出一个 `InterruptedException` 没有什么特别的原因。不等待某事而仅执行非阻塞任务的代码不会抛出“InterruptedException”。所以内部 try 可以只有一个 finally 子句而没有捕获。 (3认同)
  • 假设您想优雅地处理对 semaphore.acquire() 的调用抛出 InterruptedException 的情况,那么嵌套的 try-catch 是必要的。InterruptedException 可以在调用 semaphore.acquire() 期间和获取之后抛出。http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html#acquire() (2认同)