public InstanceSkipper(RingManager ring, CoordinatorRole coordinator) {
   this.coordinator = coordinator;
   this.ring = ring;
   if (ring.getConfiguration().containsKey(ConfigKey.multi_ring_start_time)) {
     this.boot_time = Long.parseLong(ring.getConfiguration().get(ConfigKey.multi_ring_start_time));
   } else {
     this.boot_time = 0;
   }
   logger.info("InstanceSkipper use boot time: " + boot_time);
 }
 @Override
 public void run() {
   if (coordinator.multi_ring_lambda > 0) {
     while (ring.isNodeCoordinator()) {
       try {
         long time = System.currentTimeMillis();
         int latency_compensation = coordinator.latency_compensation;
         long valueSent = coordinator.value_count.get();
         float executionTime = ((float) (time - boot_time - latency_compensation)) / 1000.0f;
         long expectedValues = (long) ((coordinator.multi_ring_lambda) * executionTime);
         long skip = expectedValues - valueSent;
         if (skip > 0) {
           if (logger.isTraceEnabled()) {
             logger.trace(String.format("InstanceSkipper sent skip %d values", skip));
           }
           Promise p = null;
           try {
             p = coordinator.getPromiseQueue().take(); // wait for a promise
           } catch (InterruptedException e) {
           }
           // send Phase2 with skip value
           if (p != null) {
             Value v = new Value(Value.getSkipID(), Long.toString(skip).getBytes());
             coordinator.value_count.addAndGet(skip);
             Message m =
                 new Message(
                     p.getInstance(),
                     ring.getNodeID(),
                     PaxosRole.Acceptor,
                     MessageType.Phase2,
                     p.getBallot(),
                     0,
                     v);
             if (ring.getNetwork().getLearner() != null) {
               ring.getNetwork().getLearner().deliver(ring, m);
             }
             if (ring.getNetwork().getAcceptor() != null) {
               ring.getNetwork().getAcceptor().deliver(ring, m);
             } else { // else should never happen, since there is no coordinator without acceptor!
               ring.getNetwork().send(m);
             }
           }
         }
         Thread.sleep(coordinator.multi_ring_delta_t);
       } catch (InterruptedException e) {
         Thread.currentThread().interrupt();
         break;
       }
     }
     logger.debug("InstanceSkipper stopped.");
   }
 }