2012-10-22 206 views
0

我想要一個Java中的Mutex,它讓我在一個線程中等待它,並在另一個線程中釋放它。我知道我可以使用容量爲1的信號量,但問題是「acquire()」方法會拋出「InterruptedException」。在Java中有什麼特別的同步方式可以達到這個目的嗎?Java中互斥線程的互斥量?

+0

爲什麼中斷的異常可能會被拋出? –

+0

在任何舊對象上使用同步塊都有問題嗎? – Wug

+0

@enno Shioji:我想確保我可以獲得許可證! – moorara

回答

3

幸運的是,信號量提供了這種方法對你:)

public void acquireUninterruptibly()

從此信號量獲取許可證,阻塞,直到有一個是可用的 。獲取許可證(如果有),並立即返回 ,將可用許可證的數量減少一個。

如果沒有許可證是可用的,則當前線程用於 線程調度目的,禁止,直到其他線程 調用此信號量和當前線程 是下一個要被分配許可的釋放()方法處於休眠狀態。

如果在等待許可,然後 它將繼續等待當前線程被中斷,但在該線程分配 時間的許可證可以改變相比,它會接收到的時間的 許可證沒有發生中斷。當線程從 這個方法返回時,其中斷狀態將被設置。

0

如果你有一個線程將要等待的代碼,那麼除非你使用同步塊,否則你一定要處理中斷的異常。另外,中斷異常有什麼問題?

1

InterruptedException不是問題,只是把它包在一個循環:

while(true) { 
    try { 
     semaphore.acquire(); 
     break; 
    } catch(InterruptedException e) { 
     //swallow, continue; 
    } 
} 

但是這個代碼是不是很安全,優雅,但將努力爲您提供您「要確保你能獲得允許!

+0

如果在catch子句中完成Thread.currentThread()。interrupt(),我會說它幾乎是處理這個問題的最好方法(除了使用acquireUninterruptibly方法)。 –

0

的ThreadA

volatile boolean waitCondition = true 

synchronized(lockObject) { 
    while (waitContidion) { 
    lockObject.wait(); 
    } 
} 

ThreadB

synchronized(lockObject) { 
    waitCondition = false; 
    lockObject.notifyAll(); 
} 

或鎖定實例使用條件/信號。

InterruptedException的正確處理是非常重要的,至少你必須設置它的中斷標誌與Thread.currentThread()。中斷()在catch塊的方法。