public synchronized void run(List<Operation> operations, int nrConcurrent) {
   sLog.info("Running " + operations.size() + " tasks...");
   iRunners = new ArrayList<Runner>();
   iTasks = new Pool(operations);
   iFinished.clear();
   iExec.clear();
   iQuality.clear();
   iT0 = System.currentTimeMillis();
   for (int i = 0; i < nrConcurrent; i++) {
     Runner r = new Runner();
     Thread t = new Thread(r);
     t.setDaemon(true);
     t.setName("Runner #" + (1 + i));
     t.start();
     iRunners.add(r);
   }
   do {
     try {
       Thread.sleep(10000);
     } catch (InterruptedException e) {
       break;
     }
     sLog.info(toString());
     logCounters();
   } while (nrFinished() < operations.size());
   sLog.info("All " + toString());
 }
    public void run() {

      for (int i = 0; i < 10; i++) {
        c.decrement();
        try {
          Thread.sleep(100);
        } catch (InterruptedException ie) {
          // nothing to do
        }
      }
    }
 @Override
 public void run() {
   counter.decrement();
 }
 public double averageQuality() {
   return iQuality.value() / iQuality.count();
 }
 public double totalExecutionTimeInSeconds() {
   return iExec.value() / 1000.0;
 }
 public int nrFinished() {
   return iFinished.count();
 }