【问题标题】:Returning a value from a void method via other non void method通过其他非 void 方法从 void 方法返回值
【发布时间】:2015-03-15 12:31:05
【问题描述】:

我有一个名为 A 的 Void 方法,以及一个从 A 返回 Object 的方法,名为 C。

方法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 或其他类,但我真的很困惑,我不知道该怎么做。 我可以有尽可能多的实例来发送我想要的请求,但我只能有一个返回响应的类,因此只有一个继承方法为请求响应的其他类提供响应。

感谢您的宝贵时间。

【问题讨论】:

  • 你不能从 void 方法返回任何东西。这就是空的意思。
  • 我不明白你的意思...
  • 请编辑您的问题,使其具有更真实的标题。诸如“通过回调返回值”之类的内容应该有助于获得有用的答案。
  • 另外,我建议您一次迈出一步。首先解决如何使用您拥有的方法和约束来获得响应。然后,看看如何让一切都异步。
  • 好的,谢谢 Magnamag

标签: java concurrency


【解决方案1】:

我曾尝试在方法 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;
}

【讨论】:

  • ThreadLocal 好像是我需要的,但是不得不说方法A需要注册在API里面的一个list上,所以才会正确收发数据,所以注册不了并取消注册该类的一个实例,因为在这个 api 中需要在主类上并且有很多解决方法。感谢您的帮助,希望一切顺利。
猜你喜欢
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-07
  • 2016-02-12
相关资源
最近更新 更多