Java同步函数在回调时解锁

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java同步函数在回调时解锁相关的知识,希望对你有一定的参考价值。

我有一个带有GetTemperature()函数的类:

  1. 连接到设备
  2. 向设备发送命令以读取温度
  3. 读取温度时触发回调OnGetTemperature()
  4. 在回调中,我与设备断开连接

此功能是从android中的React Native应用程序调用的,可以多次调用。我无权访问React Native应用来限制函数调用。问题是我想使此功能同步。因为一次只能建立一个连接。

我试图使GetTemperature()函数同步,但该函数提早返回并且不等待OnGetTemperature(),所以这不起作用。有什么方法可以锁定函数并从回调中将其解锁吗?我尝试了ReentrantLock在调用GetTemperature()时锁定该类并在回调中将其解锁。但是,当回调被触发时,应用崩溃。也许对象已锁定,并且回调无法从其他线程运行?

答案

Semaphone将为您解决问题:

public class Test {

private Semaphore semaphore = new Semaphore(1); // Allow max 1 'palyer'

public static void main(String[] args) {
    Test t = new Test();
    t.start(1);
    t.start(2);
    t.start(3);
    t.start(4);
}

private void start(int i) {
    try {
        semaphore.acquire();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("start " + i);
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }
            stop(i);
        }
    };
    new Thread(runnable).start();
}

private void stop(int i) {
    System.out.println("stop " + i);
    semaphore.release();
}
}

第一次调用start时,获取将增加semaphore's的计数,然后继续(打印“开始1”等)。第二次调用start时,执行将一直持续到调用。release为止,这将在“开始1”的线程在100毫秒后调用stop时发生。

输出将是您想要的start 1, stop 1, start 2, stop 2, ...。如果删除信号量,输出将是您想要的start 1, start 2, start 3, start 4, stop 1, stop 2, stop 3, stop 4

在您的情况下,这是一个调用stop的回调,而不是线程,但是我确定您仍然明白我的意思。

要使解决方案完整,您需要添加一些错误处理。例如,您不能确定总是会有回调。因此,如果release已等待回调10秒钟,则可能要从start调用。stop

以上是关于Java同步函数在回调时解锁的主要内容,如果未能解决你的问题,请参考以下文章

如何在启动应用程序时锁定方向并在导航到 Viewcontroller 时解锁它

如何以编程方式禁用解锁屏幕

JavaScript 异步操作之回调函数

异步回调函数

同步回调函数和异步回调函数

立即从同步代码执行异步回调