我的程序是一个无限循环。在进入循环之前,我实例化了 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/