通过其他非void方法从void方法返回值

时间:2015-03-15 12:31:05

标签: java concurrency

我有一个名为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方法为请求响应的其他类提供响应。

感谢您的时间。

1 个答案:

答案 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;
}