Java:从多线程检索计时的最佳方法
我们有1000个线程访问web服务,以及调用所需的时间。我们希望每个线程将自己的计时结果返回给主应用程序,以便记录各种统计数据。 请注意,为此考虑了各种工具,但出于各种原因,我们需要编写自己的工具。 每个线程返回计时的最佳方式是什么?到目前为止,我们考虑了两种选择:- 1.一旦一个线程有了它的计时结果,它就会调用一个提供同步方法的单例来写入文件。这确保了所有线程都将依次写入文件(尽管顺序不确定-这很好),并且由于调用是在线程获取定时结果后完成的,因此阻塞等待写入并不是真正的问题。当所有线程都完成后,主应用程序可以读取该文件以生成统计信息。 2.使用Executor、Callable和Future接口 哪种方法最好,或者还有其他更好的方法吗? 非常感谢Java:从多线程检索计时的最佳方法,java,Java,我们有1000个线程访问web服务,以及调用所需的时间。我们希望每个线程将自己的计时结果返回给主应用程序,以便记录各种统计数据。 请注意,为此考虑了各种工具,但出于各种原因,我们需要编写自己的工具。 每个线程返回计时的最佳方式是什么?到目前为止,我们考虑了两种选择:- 1.一旦一个线程有了它的计时结果,它就会调用一个提供同步方法的单例来写入文件。这确保了所有线程都将依次写入文件(尽管顺序不确定-这很好),并且由于调用是在线程获取定时结果后完成的,因此阻塞等待写入并不是真正的问题。当所有线程都完成
Paul我能想到的另一个可能的解决方案是使用CountDownLatch(来自java并发程序包),每个线程都将其递减(标记它们已完成),然后一旦全部完成(并且CountDownLatch达到0),您的主线程就可以愉快地完成它们,询问他们的时间。executor框架可以在这里实现。时间处理可以由可调用对象完成。将来可以帮助您确定线程是否已完成处理。使用后一种方法 您的工作人员实现Callable。然后将它们提交到线程池,并为每个线程池获得一个未来实例 然后只需调用Futures上的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....
}
}
import java.util.*;
导入java.util.concurrent.*;
公共类WebServiceTester{
公共静态类测试器
实现可调用的{
公共整数调用(){
整数start=now();
//在这里做测试
整数end=now();
返回结束-开始;
}
}
公共静态void main(字符串args[])引发异常{
ExecutorService池=Executors.newFixedThreadPool(1000);
Set=newhashset();
对于(int i=0;i<1000 i++){
set.add(pool.submit(newtester());
}
集合结果=新集合();
for(未来:集合){
results.put(future.get());
}
//按照您的意愿操纵结果。。。。
}
}
您可以向线程传递一条消息,以向其报告结果。然后,您就可以拥有一个文件写入线程,该线程从队列中取出写入文件。这不取决于web服务的线程处理。非常感谢您的回复。非常感谢