Java:从多个线程检索计时的最佳方法

时间:2010-07-20 11:22:37

标签: java

我们有1000个线程可以访问网络服务并计算通话时间。我们希望每个线程将自己的计时结果返回给主应用程序,以便可以记录各种统计信息。 请注意,考虑了各种工具,但出于各种原因,我们需要编写自己的工具。 每个线程返回时间的最佳方法是什么 - 到目前为止我们已经考虑了两个选项: - 1.一旦一个线程有其定时结果,它就会调用一个单例,它提供一个同步方法来写入该文件。这可以确保所有每个线程依次写入文件(虽然以未确定的顺序 - 这很好),并且由于调用是在线程获取定时结果之后完成的,因此被阻塞等待写入不是真的是一个问题。当所有线程都完成后,主应用程序可以读取文件以生成统计信息。 2.使用Executor,Callable和Future接口 哪种方式最好,还是有其他更好的方式? 首先十分感谢 保罗

4 个答案:

答案 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传递给线程以向其报告结果。然后,您可以拥有一个文件写入线程,该线程从队列中写入文件。