简体   繁体   English

如何创建一个在Java中接受回调函数的方法?

[英]How to create a method that accepts a callback function in java?

I created a distributed lock class that I designed to be used like this: 我创建了一个分布式锁类,旨在像这样使用它:

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

In my current implementation, lock() blocks until the lock is acquired. 在我当前的实现中,lock()阻塞直到获得锁为止。 But I am running into some deadlock issues with this implementation. 但是我在实现过程中遇到了一些僵局问题。 So I'd like to rewrite it to be asynchronous, but I have no idea how to do that in java. 因此,我想将其重写为异步的,但是我不知道如何在Java中做到这一点。

Something like this would work I think: 我认为这样的事情会起作用:

myLock.lock(myCallbackFunction);

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

Is there a way to do this in java? 有没有办法在Java中做到这一点?

EDIT (More detail): The reasons why the synchronous implementation is deadlocking are complicated and not relevant. 编辑(更多详细信息):同步实现死锁的原因很复杂,并且不相关。 The distributed lock is acquiring mutual exclusion of a resource across a network with multiple systems. 分布式锁正在通过具有多个系统的网络获取资源的互斥。 Really the only thing I'm looking for is how to write a method that accepts a callback function. 我真正要寻找的唯一东西就是如何编写一个接受回调函数的方法。

You can't do that in Java yet. 您还不能使用Java做到这一点。 What you can do is define a LockCallback interface: 可以做的是定义一个LockCallback接口:

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

and have MyLock#lock take a LockCallback as a parameter. 并让MyLock#lock接受LockCallback作为参数。 Then callers can call it as 然后,呼叫者可以将其称为

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

Lambda syntax in Java 8 should make this a little less ugly looking. Java 8中的Lambda语法应该使外观看起来不那么难看。

与其编写自己的想法,然后由于无法实现而放弃想法,为什么不使用Semaphore ,它已经存在并且可以正确实现?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何创建接受可变数量参数的 Java 方法? - How can I create a Java method that accepts a variable number of arguments? 在Java 8中,如何创建一个接受布尔条件和带有参数作为参数的lambda的方法? - How to create a method that accepts a boolean criteria and a lambda with arguments as a parameter in Java 8? Java - 如何创建接受不同枚举的通用抽象方法? - Java - How to create generic abstract method that accepts different enums? 如何在没有方法重载的情况下创建一个接受java中的String []和Integer []的方法? - how do i create a Method that accepts both String[] and Integer[] in java without method overloading? 如何创建一个接受用户输入的Java程序? - How to create a Java Program that accepts user inputs? 如何在Java中使用泛型来创建一个泛型接口,该接口定义仅接受实现作为参数的方法? - How would I use generics in Java to create a generic interface that defines a method that only accepts the implementation as a parameter? 如何在jni中创建CBTHook,然后在回调函数中调用Java函数? - How to create a CBTHook in jni and then call a java function in the callback function? 创建仅接受非抽象 Class 类型的 java 方法 - Create java method that only accepts non-abstract Class types 创建一个方法,接受可变长度的Function参数,可能有不同的类型 - Create a method that accepts variable length of Function arguments with possibly different types 如何在Java函数返回之前等待某个回调方法被调用? - how to wait for a certain callback method to be called before a function returns in java?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM