在这里,我实现了以下两个功能,如下所示:
Output1 computeFirst(Input1 input) {
String lockName = input.getId();
LockItem lockItem = acquireLock(lockName);
try{
#critical section
}catch(Exception e){
log.error(e);
}finally{
releaseLock(lockItem);
}
}
Output2 computeSecond(Input2 input) {
String lockName = input.getId();
LockItem lockItem = acquireLock(lockName);
try{
#critical section
}catch(Exception e){
log.error(e);
}finally{
releaseLock(lockItem);
}
}
以上两个函数的调用流程不同。
从上面的两个函数中,我想通过编写如下另一个函数来抽象出acquireLock和releaseLock功能:
executeWithLock(String lockName, funcionReference) {
String lockName = input.getId();
LockItem lockItem = acquireLock(lockName);
try{
func.apply
} catch(Exception e){
log.error(e);
} finally {
releaseLock(lockItem);
}
}
我无法弄清楚如何实现executeWithLock函数,在这种情况下,我已经在stackoverflow中浏览了有关如何将函数作为参数传递的相关文章,但了解得不多。
答案 0 :(得分:0)
Runnable也不起作用,因为还有输出。
public interface Identifiable{
String getId();
}
public static <T extends Identifiable,R> R executeWithLock(T input, Function<T,R> func) {
String lockName = input.getId();
LockItem lockItem = acquireLock(lockName);
try{
return func.apply(input);
} catch(Exception e){
log.error(e);
return null;
} finally {
releaseLock(lockItem);
}
}
打来电话
Output1 output = executeWithLock(input1,
(input) -> {return /*compute output as in critical section*/ null;});