public void run() {
   synchronized (this) {
     while (!shouldStop && loops > 0) {
       lo.action1Direct(iloops, yieldMode);
       lo.action2Deferred(iloops, yieldMode);
       loops--;
     }
     stopped = true;
     this.notifyAll();
   }
 }
  protected long testLockedObjectImpl(
      LockFactory.ImplType implType,
      boolean fair,
      int threadNum,
      int loops,
      int iloops,
      YieldMode yieldMode)
      throws InterruptedException {
    final long t0 = System.currentTimeMillis();
    LockedObject lo = new LockedObject(implType, fair);
    LockedObjectRunner[] runners = new LockedObjectRunner[threadNum];
    Thread[] threads = new Thread[threadNum];
    int i;

    for (i = 0; i < threadNum; i++) {
      runners[i] = new LockedObjectRunner1(lo, loops, iloops, yieldMode);
      // String name = Thread.currentThread().getName()+"-ActionThread-"+i+"_of_"+threadNum;
      String name = "ActionThread-" + i + "_of_" + threadNum;
      threads[i] = new Thread(runners[i], name);
      threads[i].start();
    }

    for (i = 0; i < threadNum; i++) {
      runners[i].waitUntilStopped();
    }
    while (0 < lo.getDeferredThreadCount()) {
      Thread.sleep(100);
    }
    Assert.assertEquals(0, lo.locker.getHoldCount());
    Assert.assertEquals(false, lo.locker.isLocked());
    Assert.assertEquals(0, lo.getDeferredThreadCount());

    final long dt = System.currentTimeMillis() - t0;
    lo.stats(false);

    System.err.println();
    final String fair_S = fair ? "fair  " : "unfair";
    System.err.printf(
        "---- TestRecursiveLock01.testLockedObjectThreading: i %5s, %s, threads %2d, loops-outter %6d, loops-inner %6d, yield %5s - dt %6d ms, avrg %8d ns, deviation [ %8d .. %8d ] ns",
        implType,
        fair_S,
        threadNum,
        loops,
        iloops,
        yieldMode,
        dt,
        lo.avrg,
        lo.min_deviation,
        lo.max_deviation);
    System.err.println();
    return dt;
  }