2017-08-16 35 views
0

我想弄清楚如何才能正確地等待,直到在另一個線程中釋放一個鎖。如何等待,直到在Java的另一個線程中釋放鎖定?

我覺得代碼將更好地解釋這是什麼意思:

myLock.lock(); 
sendSomewhereMyLock(myLock); //creates new threads inside 
myLock.waitUntilReleasedByAnotherThread(60L, TimeUnit.SECONDS); 
//do something after the lock is released 

我認爲tryLock(long time, TimeUnit unit)是我需要的方法,但Java文檔說,因爲鎖被收購的方法將被立即執行當前線程:

如果鎖定可用,則此方法立即返回 值爲true。如果鎖不可用,則當前線程 的線程調度目的就退出,一直處於休眠狀態 三種情況之一發生:

  • 鎖定由當前線程獲得;或
  • 某些其他線程中斷當前線程,並支持中斷鎖獲取;或
  • 在指定的等待時間

我應該用什麼呢?

+1

這是一個XY問題(http://mywiki.wooledge.org/XyProblem)?你究竟在努力實現什麼? – Jason

回答

1

我知道你在尋找的是一個condition

有了,你可以這樣定義「workCompleted」的條件,並具有初始線程檢查和等待該條件。

final Condition workCompleted = myLock.newCondition(); 
//... 
myLock.lock(); 
try { 
    final OtherThread otherThread = startOtherThread(myLock, workCompleted); 
    while (otherThread.completed() == false) { 
    workCompleted.await(); 
    } 
} finally { 
    myLock.unlock(); 
} 

// other thread 
doTheWork(); 
this.completed = true; 
theLock.lock(); 
try { 
    workCompleted.signal(); 
} finally { 
    theLock.unlock(); 
} 

有幾個這樣的條件在concurrent package預先製作,其中一些可能更符合您的要求比上面的簡單例子。

+0

看起來像我需要的東西。謝謝! – Alexandr

0

我建議CountDownLatch,而這正是爲此目的而設計:

一個同步輔助類,它允許一個或多個線程等待,直到其他線程中執行的一組操作完成。

用法示例:

CountDownLatch latch = new CountDownLatch(1); 
new Thread(() -> { 
    doSomething(); 
    latch.countDown(); // Reaches 0, latch is released 
}).start(); 
latch.await(60L, TimeUnit.SECONDS); 
相關問題