2011-10-11 29 views
2

我們有一個用例,我們需要獲取鎖定併發送通知,如果獲取鎖定時間超過5分鐘。我們仍應該永遠等待鎖定。Java中鎖定獲取的延遲通知

我們使用重入鎖和lock.tryLock(5,TimeUnit.Minutes)是不夠的,因爲它出來5分鐘後。

,我們試圖在該選項:

while(!lock.tryLock(5, TimeUnit.minutes)) { 
    // send notification 
} 

但我想,這將導致失鎖(其中鎖已被要求爲順序)的公平性

有沒有人遇到這樣的如果是的話,請解釋它是如何解決的。

我們不希望在某些上下文中存在維護鎖和相應等待線程的元信息的手動解決方案(例如何時啓動鎖獲取),而另一個線程連續輪詢整個上下文以查看它是否有任何等待超過5分鐘的線程。

回答

4

設置ScheduledExecutorService。在獲得鎖定之前,安排一項任務在5分鐘內完成並保持未來。當獲得鎖定時,取消未來。

ScheduledExceutorService ses; 
Future f = ses.schedule(new Runnable(){...}, 5, TimeUnit.Minutes); 
lock.lock(); 
f.cancel(); 

如果您在提交的任務執行之前獲取鎖,則應取消該鎖。