public void run() {
      Random random = new Random(this.hashCode());
      random.setSeed(System.currentTimeMillis()); // comment out for determinstic
      intSet.threadLocalInit();
      
      boolean toggle = true;
      try {
        while (true) {
          boolean result = true;
          element = random.nextInt();
          if (Math.abs(element) % 100 < percent) {
            if (toggle) {        // insert on even turns
              value = element / 100;
              result = Thread.doIt(new Callable<Boolean>() {
                public Boolean call() {
                  return intSet.insert(value);
                }
              });
              if (result)
                myDelta++;
            } else {              // remove on odd turns
              result = Thread.doIt(new Callable<Boolean>() {
                public Boolean call() {
                  return intSet.remove(value);
                }
              });
              myRemoveCalls++;
              if (result)
                this.myDelta--;
            }
            toggle = !toggle;
          } else {
            Thread.doIt(new Callable<Void>() {
              public Void call() {
                intSet.contains(element / 100);
                return null;
              }
            });
            myContainsCalls++;
          }
        }
      } catch (GracefulException g) {
        // update statistics
        synchronized (lock) {
          insertCalls   += myInsertCalls;
          removeCalls   += myRemoveCalls;
          containsCalls += myContainsCalls;
          delta         += myDelta;
        }
        return;
      }
    }