java - 重用可调用实例似乎可行。这可以吗?

标签 java callable

我的程序是一个无限循环。在进入循环之前,我实例化了 2 个可调用对象。它们各自执行一个需要并行运行返回结果的 HTTP 请求。它们是不同的 java 类,并且不共享任何属性/数据。然而,它们都更新了自己的内部属性,即某种计数器,我需要从程序启动时就使它们保持 Activity 状态,直到我停止它。

我的代码如下所示。如果这很可怕,请原谅我,我已经 6 年没有编码了。

callable1 = new Callable1();
callable2 = new Callable2();

while(true) {

  //Preparation of the dynamic parameters
  ...
  callable1.setData(some_dynamic_parameters1); 
  callable2.setData(some_dynamic_parameters2);

  ExecutorService threadPool = Executors.newFixedThreadPool(2);
  CompletionService<String> completion = new ExecutorCompletionService<String>(threadPool);
  completion.submit(callable1);
  completion.submit(callable2);
  threadPool.shutdown();

  //I need to wait for both tasks to complete before going further
  String firstReply = completion.take().get();
  String secondReply = completion.take().get();
  ...

}

两个可调用对象的代码如下所示。它们的不同之处在于 call() 方法细节。

public class callable1 extends Callable {

  private counters = new PositionCounters();
  private data = null;

  public void setData(data) {
    this.data = data;
  }

  public String call() {
    //Create HTTP query from information contained in [data]
    ...
    //update internal counter.
    counters.update(query_result)
  }
}
每次,我将可调用对象提交给执行器,每个对象中的“计数器”都会更新,并且似乎是并行完成这项工作。但我不相信我的解决方案是最好的,因为我读到线程永远无法重用。然而,这就是我在这里所做的。我想听听您对此的专家意见。您认为实现这一目标的最佳方法是什么?

感谢您的帮助!

最佳答案

可调用对象不是线程,它只是线程将执行的代码的包装器。您可以重用它,只要它的状态没有过时,或者您可以重置它(或者对其进行修改,以便下次运行只需要该状态等...)。您仍然应该确定这是否真正解决了任何性能问题,因为这似乎是每次调用 2 个对象构造 (+GC)。

关于java - 重用可调用实例似乎可行。这可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25567211/

相关文章:

java - Tekton 中有未知字段 "container"

java - 如何将请求 header 添加到基于 Tyrus 注释的客户端

java - 如何使用ControllerAdvice中的ExceptionHandler处理从 Controller 中的ExceptionHandler抛出的异常?

java - 在Android Studio中运行ExecutorService时出现类异常错误

java - 如何知道 Future 是使用 Callable 还是 Runnable 创建的

java - 多线程应用程序连续失败后如何将主机名添加到阻止列表?

按列公式 CPLEX - 在列中添加新的约束集

python - 如何解决 Python 类型错误 : 'module' object is not callable?

java - Sonar : Array should contain trailing comma

java - 匹配另一个字符串多次出现的正则表达式