我有一个名为A的Void方法,以及一个从A返回Object的方法。
方法A是通过名为B的方法调用的响应,该方法仅发送方法A的请求以进行响应,并且我想发送响应,等待它然后在相同的方法上返回它(方法C)。
方法A是来自超类的方法,所以我不能修改它。 该方法是API的方法,我称之为提供我想要的参数,然后方法A将使用该参数进行响应。
我也希望是线程安全的,因为响应需要准确,否则程序将失败。
方法A:
@Override
public void onMessageReceived(Object response) {
//The args of the method is what I want to return in method C.
}
方法B:
requestResponse(data);
方法C:
public Object sendMessage(byte[] data) {
requestResponse(data);
return /* THE RESPONSE FROM METHOD A */;
}
我试图在方法A中做一些事情,如:
this.response = response;
方法C:
return this.response;
但我不认为这是安全和实用的。 我还想过为每个请求创建一个新实例,但这可能需要很多内存和时间。 方法C不能花费时间来返回响应。 有些人告诉我使用Future<>或其他课程,但我真的很困惑,我不知道该怎么做。 我可以有尽可能多的实例来发送我想要的请求,但是我只能有一个返回响应的类,所以只有一个inhertired方法为请求响应的其他类提供响应。
感谢您的时间。
答案 0 :(得分:0)
我尝试在方法A中执行某些操作,如
this.response = response
和方法C:return this.response
,但我不认为这是安全和实用的。
不,不是,因为它不是线程安全的。存在一种竞争条件,其中方法C可以返回在处理来自另一个线程的无关请求的响应时分配的response
。
我还考虑过为每个请求创建一个新实例,但这可能需要很多内存和时间。
这种方法可以避免竞争条件。根据对象实例化的成本和您期望的并发请求数,可能是正确的方法。完成对象后,垃圾收集器将回收其内存。当然,如果每个对象分配10MB并且您有1000个并发请求,那么这将无效。
如果父类是线程安全的(即它可以在同一时间处理多个请求,这应该在API文档中解释),并且您需要为每个请求使用相同的实例,您可以将响应与调用线程,使用ThreadLocal
(假设onMessageReceived
由调用sendMessage
的同一线程调用):
private ThreadLocal<Object> responses;
public void onMessageReceived(Object response) {
response.set(response);
}
public Object sendMessage(byte[] data) {
requestResponse(data);
Object response = responses.get();
responses.remove();
return response;
}