Java 我是否需要将以下场景视为关键场景?
我有Android java服务,它将使用Java 我是否需要将以下场景视为关键场景?,java,android,aidl,hal,hidl,Java,Android,Aidl,Hal,Hidl,我有Android java服务,它将使用HIDL调用与HAL服务交互 我有以下情况,我不确定是否将其视为关键 +----------+ (AIDL) +--------------+ |App thread|-------->|Java Service | (HIDL) +-----------+ +----------+ |(SendFunction)|------->|CPP service| +--------
HIDL
调用与HAL
服务交互
我有以下情况,我不确定是否将其视为关键
+----------+ (AIDL) +--------------+
|App thread|-------->|Java Service | (HIDL) +-----------+
+----------+ |(SendFunction)|------->|CPP service|
+--------------+ +-----------+
^
+--------------+ |
|AnotherThread |-----|
+--------------+
send函数的定义如下所示
private void SendFunction(int status, DiagCommandDesc response) {
try {
server.executeCommandResponse(status, response);
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "Response sent to HAL.");
}
} catch (Exception e) {
if (Log.isLoggable(TAG, Log.DEBUG)) {
Log.d(TAG, "HAL Server error.");
}
}
}
正在从两个不同的线程调用SendFunction
。
其中,server
是使用HIDL
的CPP服务器的实例
我的问题
server.executeCommandResponse(status, response);
我是否需要将上述调用
视为关键并同步它?由于将从两个不同的线程访问server
对象。否,您不必在Java服务中保护对server.executeCommand响应(状态、响应)
的调用
活页夹通信已经是线程安全的。对executeCommandResponse
的并发调用在HAL服务中是安全的,必须由HAL本身来确保。在HAL方面,有一种简单的方法可以确保线程安全:只使用一个线程池。不过,这将使所有其他线程等待第一个线程完成
intmain()
{
::android::hardware::configureRpcThreadpool(1,true);
::安卓::sp服务=新迈哈尔;
如果(::android::OK!=服务->注册服务())
返回退出失败;
::android::hardware::joinRpcThreadpool();
返回退出成功;
}
您可以在此处找到更多信息: