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计数,然后继续(打印"start 1"等(。第二次调用start时,执行将一直保持到 。调用release,这将在 "start 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的回调,而不是线程,但我相信您仍然明白我的意思。

为了使解决方案完整,需要添加一些错误处理。例如,您无法确定是否始终存在回调。所以你可能想打电话.releasestart是否stop等待回调,例如 10 秒。

最新更新