Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:从多线程检索计时的最佳方法_Java - Fatal编程技术网

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

Java:从多线程检索计时的最佳方法,java,Java,我们有1000个线程访问web服务,以及调用所需的时间。我们希望每个线程将自己的计时结果返回给主应用程序,以便记录各种统计数据。 请注意,为此考虑了各种工具,但出于各种原因,我们需要编写自己的工具。 每个线程返回计时的最佳方式是什么?到目前为止,我们考虑了两种选择:- 1.一旦一个线程有了它的计时结果,它就会调用一个提供同步方法的单例来写入文件。这确保了所有线程都将依次写入文件(尽管顺序不确定-这很好),并且由于调用是在线程获取定时结果后完成的,因此阻塞等待写入并不是真正的问题。当所有线程都完成

我们有1000个线程访问web服务,以及调用所需的时间。我们希望每个线程将自己的计时结果返回给主应用程序,以便记录各种统计数据。 请注意,为此考虑了各种工具,但出于各种原因,我们需要编写自己的工具。 每个线程返回计时的最佳方式是什么?到目前为止,我们考虑了两种选择:- 1.一旦一个线程有了它的计时结果,它就会调用一个提供同步方法的单例来写入文件。这确保了所有线程都将依次写入文件(尽管顺序不确定-这很好),并且由于调用是在线程获取定时结果后完成的,因此阻塞等待写入并不是真正的问题。当所有线程都完成后,主应用程序可以读取该文件以生成统计信息。 2.使用Executor、Callable和Future接口 哪种方法最好,或者还有其他更好的方法吗? 非常感谢
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服务的线程处理。非常感谢您的回复。非常感谢