2014-05-13 3 views
0

J'utilise java.util.concurrent.Executors et java.util.concurrent.ExecutorService pour exécuter des threads parallèles. S'il vous plaît laissez-moi savoir comment capturer Temps pris pour compléter tous les threads.Capture Durée totale d'exécution d'un thread parallèle

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

Voulez-vous dire la somme du temps de chaque fil, ou le temps écoulé entre le premier fil commence à quand le dernier fil se termine? –

+0

S'il vous plaît laissez-moi savoir comment calculer les deux. – user3558691

+0

Je pense que vous faites référence à 1.sum du temps de chaque thread signifie-> Seul le temps nécessaire pour exécuter des tâches thread (temps total de la méthode Run) 2. temps à partir du moment où le premier thread commence à la fin du dernier thread ---> y compris le temps pris par le fil principal. est-ce? – user3558691

Répondre

0

Créer tâche simple comme

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); 
    } 
} 

// principale passe AtomicLong à chaque tâche de capturer le temps pris pour ce fil. et résumez-le à la même instance. AtomicLong est thread-safe.

  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(); 

// Attendez que tous les threads soient terminés.

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

// Calculer le temps

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

// Retourne la valeur de Atomic long

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