2012-08-24 1 views
8

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

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

するか、InterruptedExceptionあるが、取得時に発生したときに、私はむしろ、release()を呼び出すべきではありません():

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

答えて

8

acquire()中にInterruptedExceptionが発生した場合のコール・リリース()?

すべきではありません。 .acquire()が中断された場合、セマフォは取得されないため、解放しないでください。

スレッドが取得メソッドの呼び出しの前に、または例外:InterruptedExceptionがスローされますと、何の許可は保持しないので、解放するために必要になる許可証を取得するために待っている間に中断されている場合はあなたのコードは

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

ありがとうございます。あなたのように私のコードを変更します。 – kasimir

+5

これの問題は、semaphore.acquire()がInterruptedExceptionをスローすることです。 – jblack

0

でなければなりません。許可証が取得されたことが確実な場合(取得メソッド呼び出しを呼び出した後)にのみ、許可証を解除する必要があります。だから、あなたがより良いようなあなたのtryブロックを開始する前に、何かを取得:答えを受け入れ

sem.acquire(); 
try{ 
    doMyWork(); 
}finally{ 
    sem.release(); 
} 
3

のNOSのはsemaphore.acquire除いて、部分的に正しい()もInterruptedExceptionがスローされます。したがって、100%正しいとすると、コードは次のようになります。

+0

ネストされたtry catchが本当に必要ですか? 1つのtry catchでセマフォを取得して解放することはできますか? – Joyce

+2

semaphore.acquire()の呼び出しでInterruptedExceptionがスローされた場合、正常に処理したい場合、ネストされたtry-catchが必要です。 InterruptedExceptionは、semaphore.acquire()の呼び出し中と取得後の両方にスローされます。 http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Semaphore.html#acquire() – jblack

+0

「InterruptedException e」ではなく「Exception e」の一般的なケースを使用しても問題ありません'? – Joyce