我们有1000个线程可以访问网络服务并计算通话时间。我们希望每个线程将自己的计时结果返回给主应用程序,以便可以记录各种统计信息。 请注意,考虑了各种工具,但出于各种原因,我们需要编写自己的工具。 每个线程返回时间的最佳方法是什么 - 到目前为止我们已经考虑了两个选项: - 1.一旦一个线程有其定时结果,它就会调用一个单例,它提供一个同步方法来写入该文件。这可以确保所有每个线程依次写入文件(虽然以未确定的顺序 - 这很好),并且由于调用是在线程获取定时结果之后完成的,因此被阻塞等待写入不是真的是一个问题。当所有线程都完成后,主应用程序可以读取文件以生成统计信息。 2.使用Executor,Callable和Future接口 哪种方式最好,还是有其他更好的方式? 首先十分感谢 保罗
答案 0 :(得分:3)
使用后一种方法。
您的员工实施Callable。然后,将它们提交给线程池,并为每个实例获取一个Future实例。
然后只需在期货上调用get()即可得到计算结果。
import java.util.*;
import java.util.concurrent.*;
public class WebServiceTester {
public static class Tester
implements Callable {
public Integer call() {
Integer start = now();
//Do your test here
Integer end = now();
return end - start;
}
}
public static void main(String args[]) throws Exception {
ExecutorService pool = Executors.newFixedThreadPool(1000);
Set<Future<Integer>> set = new HashSet<Future<Integer>>();
for (int i =0 ; i < 1000 i++) {
set.add(pool.submit(new Tester()));
}
Set<Integer> results = new Set<Integer>();
for (Future<Integer> future : set) {
results.put(future.get());
}
//Manipulate results however you wish....
}
}
答案 1 :(得分:0)
我能想到的另一个可能的解决方案是使用CountDownLatch(来自java并发包),每个线程递减它(标记它们已完成),然后一旦完成(并且CountDownLatch达到0)你的主线程可以愉快地通过他们所有,问他们他们的时间是什么。
答案 2 :(得分:0)
执行者框架可以在这里实现。时间处理可以由Callable对象完成。 Future可以帮助您确定线程是否已完成处理。
答案 3 :(得分:0)
您可以将ArrayBlockingQueue传递给线程以向其报告结果。然后,您可以拥有一个文件写入线程,该线程从队列中写入文件。