2013-03-04 6 views
0

Я создал распределенный класс замка, который я предназначен для использования, как это:Как создать метод, который принимает функцию обратного вызова в java?

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

В моей текущей реализации блокировки() блокирует до замка приобретаются. Но я сталкиваюсь с некоторыми проблемами взаимоблокировки с этой реализацией. Поэтому я хотел бы переписать его как асинхронный, но я не знаю, как это сделать в java.

Что-то, как это будет работать, я думаю:

myLock.lock(myCallbackFunction); 

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

Есть ли способ сделать это в Java?

EDIT (Подробнее): причины синхронной реализации взаимоблокировки сложны и не актуальны. Распределенная блокировка обеспечивает взаимное исключение ресурса через сеть с несколькими системами. На самом деле единственное, что я ищу, это написать метод, который принимает функцию обратного вызова.

+3

«Поэтому я бы хотел переписать его как асинхронный» - блокировка по определению является синхронной. Что вы подразумеваете под «Я бы хотел переписать его как асинхронный»? –

+0

Вы видели [это] (http://docs.oracle.com/javaee/6/tutorial/doc/gkkqg.html)? –

+0

Вам необходимо запустить нить или использовать один из средств пула потоков. –

ответ

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(); 
    }); 

Синтаксис Lambda на Java 8 должен сделать это немного менее уродливым.

+0

+1 это шаблон «функциональный объект» или «функтор» –

0

Вместо того, чтобы писать свои собственные, а затем отказаться от идеи, потому что вы не могли заставить ее работать, почему бы не использовать Semaphore, который уже существует и реализован правильно?

+1

Все еще не делает ничего асинхронным. –

+0

@HotLicks: Правда, но в то время как заголовок вопроса касается асинхронных методов, это не то, о чем говорит содержание вопроса. –

Смежные вопросы