CalculateThread.java

package progen.roles.standalone;

import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.List;

import progen.output.HistoricalData;
import progen.roles.Task;
import progen.roles.Worker;
import progen.userprogram.UserProgram;

/**
 * 
 * @author jirsis
 * 
 */
public class CalculateThread implements Runnable {

  private List<Task> tasks;

  private Worker worker;

  private int currentTask;

  private UserProgram userProgram;

  /** Almacén de todos los datos históricos del experimento. */
  private HistoricalData historical;

  public CalculateThread(List<Task> tasks, Worker worker, UserProgram userProgram) {
    this.tasks = tasks;
    this.worker = worker;
    this.userProgram = userProgram;
    this.currentTask = 0;
    this.historical = HistoricalData.makeInstance();
  }

  public void run() {
    synchronized (tasks) {
      for (currentTask = 0; currentTask < tasks.size(); currentTask++) {
        final Calendar before = GregorianCalendar.getInstance();
        worker.calculate(tasks.get(currentTask), userProgram);
        tasks.notifyAll();
        final Calendar after = GregorianCalendar.getInstance();
        historical.getCurrentDataCollector("PopulationTimeData").addValue("evaluation", after.getTimeInMillis() - before.getTimeInMillis());
      }
    }
  }

  public synchronized int getCompletedTasks() {
    return currentTask;
  }

  public List<Task> getTasks() {
    return tasks;
  }

}