Java同步函数在回调时解锁
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java同步函数在回调时解锁相关的知识,希望对你有一定的参考价值。
我有一个带有GetTemperature()
函数的类:
- 连接到设备
- 向设备发送命令以读取温度
- 读取温度时触发回调
OnGetTemperature()
- 在回调中,我与设备断开连接
此功能是从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同步函数在回调时解锁的主要内容,如果未能解决你的问题,请参考以下文章