2014-05-13 75 views
0

我正在使用java.util.concurrent.Executors和java.util.concurrent.ExecutorService來執行並行線程。請讓我知道如何捕獲完成所有線程所需的時間。捕獲並行線程的總執行時間

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
public class CallBackTest { 
    private static int NUM_OF_TASKS = 50; 
     Object result; 
     int cnt = 0; 
     long begTest, endTest; 

     public CallBackTest() { } 

     public void callBack(Object result) { 
       System.out.println("result "+result); 
       this.result = result; 
      } 


     public void run() { 

       ExecutorService es = Executors.newFixedThreadPool(50); 
       for(int i = 0; i < NUM_OF_TASKS; i++) { 

       CallBackTask task = new CallBackTask(i); 
       task.setCaller(this); 
       es.submit(task); 
       // at this point after submitting the tasks the 
       // main thread is free to perform other work. 
       } 
      } 

     public static void main(String[] args) { 
       new CallBackTest().run(); 
      } 
    } 
+0

你的意思是每個線程的時間的總和,或當時間第一個線程開始時最後一個線程結束? –

+0

請讓我知道如何計算兩者。 – user3558691

+0

我想你指的是每個線程的時間1.sum - >只有執行線程任務所需的時間(Run方法的總和時間)2.從第一個線程開始到最後一個線程結束的時間意味着--->包括主線程佔用的時間。是嗎 ? – user3558691

回答

0

public class SimpleTask implements Runnable { 
    AtomicLong totalTime; 
    public SimpleTask(AtomicLong totalTime) { 
     this.totalTime = totalTime; 
    } 
    @Override 
    public void run() { 
     long currentTime = System.nanoTime(); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     totalTime.addAndGet(System.nanoTime()-currentTime); 
    } 
} 

//主溜的AtomicLong創建簡單的任務,每個任務以獲取採取該線程的時間。並將其彙總到同一個實例。 AtomicLong是線程安全的。

  AtomicLong totalTime = new AtomicLong(0); 
     long currentTime = System.nanoTime(); 
     ExecutorService executor = Executors.newFixedThreadPool(numberofThread); 
     for (int i = 0; i < numberofTasks; i++) { 
      SimpleTask task = new SimpleTask(totalTime); 
      executor.submit(task); 
     } 
     executor.shutdown(); 

//等到所有線程完成。

try { 
      executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); 
     } catch (InterruptedException e) {} 

//計算時間

System.out.println("Overall time"+ (System.nanoTime()-currentTime)); 

//從原子龍獲得價值

System.out.println("All Threads Spent time"+ totalTime);