2013-03-04 46 views
0

我創建了一個分佈式的鎖類,我設計這樣使用:如何創建一個接受java中的回調函數的方法?

myLock.lock(); 
doSomething(); 
myLock.unlock(); 

在我目前的實現,鎖()塊,直到鎖被收購。但是我遇到了這個實現的一些僵局問題。所以我想重寫它是異步的,但我不知道如何在java中做到這一點。

像這樣的工作,我想:

myLock.lock(myCallbackFunction); 

private void myCallbackFunction(boolean result){ 
    if(result){ 
     doSomething(); 
     mylock.Unlock(); 
    } 
} 

有沒有辦法在Java中做到這一點?

編輯(更多詳細信息):同步實現死鎖的原因很複雜且不相關。分佈式鎖正通過具有多個系統的網絡來獲取資源的相互排斥。真的,我唯一想找的就是如何編寫一個接受回調函數的方法。

+3

「所以我想重寫它是異步的 - 鎖是同步的定義。 「我想重寫它是異步的」是什麼意思? – 2013-03-04 02:56:43

+0

你見過[this](http://docs.oracle.com/javaee/6/tutorial/doc/gkkqg.html)嗎? – 2013-03-04 02:57:32

+0

您需要啓動一個線程,或使用其中一個線程池設施。 – 2013-03-04 03:07:05

回答

3

你還不能在Java中做到這一點。你可以做的就是定義一個接口LockCallback

interface LockCallback { 
    void run(boolean result, MyLock lock); 
} 

,並有MyLock#lock採取LockCallback作爲參數。然後呼叫者可以將其稱爲

myLock.lock(new LockCallback { 
    public void run(boolean result, MyLock lock) { 
    // ... do whatever needs to be done ... 
    lock.unlock(); 
    }); 

Java 8中的Lambda語法應該使這個看起來不那麼難看。

+0

+1這是「函數對象」或「仿函數」模式 – 2013-03-04 05:05:02

0

爲什麼不使用Semaphore,它已經存在並正確實現,而不是編寫自己的,然後放棄這個想法,因爲你無法使它工作。

+1

仍然沒有任何異步。 – 2013-03-04 03:07:32

+0

@HotLicks:沒錯,雖然問題的標題是關於異步方法的,但這不是問題內容所談論的內容。 – 2013-03-04 03:10:37

相關問題