13

Java java.util.concurrent.Semaphoreのドキュメントから、semaphore.acquire()がスレッドをブロックし、後でInterruptedExceptionによって中断された場合に何が起こるかは、私にはよくわかりませんでした。セマフォ値が減少したので、セマフォを解放する必要がありますか?

現在、私は次のようなコードを使用しています。

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

または、acquire()中にInterruptedExceptionが発生したときにrelease()を呼び出さないでください。

4

3 に答える 3

13

取得()中にInterruptedExceptionが発生したときにrelease()を呼び出しますか?

貴方はするべきではない。.acquire()が中断された場合、セマフォは取得されないため、解放されない可能性があります。

あなたのコードは

// use semaphore to limit number of parallel threads
semaphore.acquire();
try {
  doMyWork();
}
finally {
  semaphore.release();
}
于 2012-08-24T07:48:13.037 に答える
8

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
}
于 2014-02-21T05:23:03.400 に答える
0

取得メソッド呼び出しの前、または許可の取得を待機している間にスレッドが中断された場合、InterruptedExceptionがスローされ、許可は保持されないため、解放する必要はありません。許可が取得されたことが確実な場合にのみ(acquireメソッド呼び出しを呼び出した後)、許可を解放する必要があります。したがって、tryブロックが開始する前に、次のように取得することをお勧めします。

sem.acquire();
try{
   doMyWork();
}finally{
   sem.release();
}
于 2012-08-24T07:55:00.557 に答える