重用一个可调用的实例似乎工作。这可以吗?

时间:2014-08-29 11:17:47

标签: java callable

我的程序是一个无限循环。在进入循环之前,我实例化2 callables 。他们每个人都执行一个HTTP请求,需要同时运行 返回结果。它们是不同的java类,它们不共享任何属性/数据。然而,他们都更新了他们自己的内部属性,某些计数器,我需要在程序开始时保持活着,直到我停止它。

我的代码看起来像这样。请原谅我,如果它是可怕的,我已经编码了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();
  ...

}

两个callables的代码都是这样的。它们的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)
  }
}

每一次,我都将callables提交给执行者,每个中的“counter”都会更新,并且它似乎并行执行。但我不相信我的解决方案是最好的,因为我读到一个线程永远不能被重用。然而,这就是我在这里所做的。我想就此提出您的专家意见。您认为实现这一目标的最佳方式是什么?

谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

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