Java 同步函数在回调上解锁

标签 java android asynchronous

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

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

此函数是从 Android 中的 React Native 应用程序调用的,可以多次调用。我无法访问 React Native 应用程序来限制函数调用。 问题是我想让这个函数同步。因为一次只能有一个连接处于 Activity 状态。

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

最佳答案

信号音器将为您解决问题:

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 acquire 将增加信号量 计数,然后继续(打印“start 1”等)。第二次调用 start 时,执行将一直持续到调用 .release 为止,这将在“start 1”的线程调用 stop 时发生100 毫秒后。

输出将是 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的回调,而不是一个线程,但我相信你仍然明白我的意思。

为了使您的解决方案完整,您需要添加一些错误处理。例如,您无法确定总会有回调。因此,如果 stop 已等待回调例如 10 秒,您可能希望从 start 调用 .release

关于Java 同步函数在回调上解锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59784804/

相关文章:

c# - 如何在 C# 中的异步方法中忘记同步上下文

java - 甲骨文。使用 LDAP 进行身份验证始终返回 -16

java - vaadin netbeans 插件有 vaadin 设计器吗?

java - 如何使用 OnItemLongClickListener 删除存储在我的设备中的文件?

java - 解析 JSONObjects 并转换为 Java 对象时出现奇怪的问题

c# - F# 异步 lambda 与 C# 异步模型互操作

java - 使用 Java 8 Time API 获取第一次和最后一次时间(以毫秒为单位)

java - Android:不可转换的类型;无法将 android.preference.Preference 转换为 androidx.preference.SeekBarPreference

java - Android 应用程序在 getString() 行崩溃

asynchronous - 当我在 goroutine 中运行 wg.Wait() 时,为什么我的代码可以正常工作?