我如何测量java中线程池的时间?

时间:2014-12-22 16:49:22

标签: java multithreading time

我使用了两种不同的方法来测量线程的时间,但结果不匹配

    **Public void Main()** 
{
        Timer timer = new Timer();
                    int timetotal;


                    timer.start();
            int numberOfThreads=5;
            ExecutorService pool= Executors.newFixedThreadPool(numberOfThreads);
            List<Future<Boolean>> futureList = new ArrayList<Future<Boolean>>();
            Set<ReadProcess_MongoDB> callList = new HashSet<ReadProcess_MongoDB>();
            CompletionService<ReadProcess_MongoDB> taskCompletionService;
            taskCompletionService = new ExecutorCompletionService<ReadProcess_MongoDB>(pool);

            Collection<Callable<ReadProcess_MongoDB>> list;
            list = new LinkedList<Callable<ReadProcess_MongoDB>>();

            for(int i=0;i<numberOfThreads;i++)
               list.add((Callable<ReadProcess_MongoDB>) new ReadProcess_MongoDB(i));

                try {

                    for (Callable<ReadProcess_MongoDB> callable : list) {
                        taskCompletionService.submit(callable);
                  }
                    for (int i = 0; i < list.size(); i++) {
                    Future<ReadProcess_MongoDB> result = taskCompletionService.take(); 

                    }
                } catch (InterruptedException e) {
                    // no real error handling. Don't do this in production!
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    // no real error handling. Don't do this in production!
                    e.printStackTrace();
                }
                finally {
                    pool.shutdown();
                     System.out.println("Done :)");
                     timer.stop();
                     System.out.println("Total consumed Time"+ timer.elapsed());
                 }

其他时间我输入了Call方法()

 **public String call()**
     {

          Timer timer = new Timer();
            int timetotal;


            timer.start();
                DBCursor cursor = coll.find(whereQuery);
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
                Logger.getLogger(ReadProcess_MongoDB.class.getName()).log(Level.SEVERE, null, ex);
            }
            timer.stop();
            usedTimeForQueryProcess = timer.elapsed();
            System.out.println("Thread Number="+this.threadNumber+  "   MongoDB_readQuery used time "+usedTimeForQueryProcess);
            System.out.println("runing.....");
      return Objects.toString(usedTimeForQueryProcess);
     }

在通话功能中,每个线程的系统打印时间和主要功能只显示总时间。这里我尝试手动检查,但两个时间都不匹配。但更大的问题是主要功能显示的时间少于所有线程的总时间(通话功能)。
 我也尝试从Call函数返回使用时间但是它也是创建问题转换为long(特别是运行时问题) 两个功能的时间
主要功能时间= 289 调用功能时间= 510(5线程) 请有人说明为什么会发生这种情况以及如何进行正确的测量?

1 个答案:

答案 0 :(得分:1)

主时间低于每个作业的,因为它们并行运行。如果将线程池大小减小到1,那么数字将更像您期望的那样。

这是执行多线程编程的好处之一,与按顺序完成相比,可以在更短的时间内完成更多的工作。