我的程序是一个无限循环。在进入循环之前,我实例化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”都会更新,并且它似乎并行执行。但我不相信我的解决方案是最好的,因为我读到一个线程永远不能被重用。然而,这就是我在这里所做的。我想就此提出您的专家意见。您认为实现这一目标的最佳方式是什么?
谢谢你的帮助!
答案 0 :(得分:1)
callable不是一个线程,它只是一个由线程执行的代码的包装器。你可以重用它,只要它的状态没有陈旧或你可以重置它(或者它被修改,以便下一次运行只需要该状态等...)。仍然你应该确定这是否真的解决了任何性能问题,因为这似乎是每次调用2个对象结构(+ GC)。