code: public void offerService() throws InterruptedException, IOException {
  
      taskScheduler.start();
  
      // refresh the node list as the recovery manager might have added
      // disallowed trackers
      refreshHosts();
  
      this.expireTrackersThread = new Thread(this.expireTrackers,
                                            "expireTrackers");
      this.expireTrackersThread.setDaemon(true);
      this.expireTrackersThread.start();
      this.retireJobsThread = new Thread(this.retireJobs, "retireJobs");
      this.retireJobsThread.setDaemon(true);
      this.retireJobsThread.start();
      expireLaunchingTaskThread.setDaemon(true);
      expireLaunchingTaskThread.start();
      jobUpdaterThread.setDaemon(true);
      jobUpdaterThread.start();
  
      if (completedJobStatusStore.isActive()) {
        completedJobsStoreThread = new Thread(completedJobStatusStore,
                                              "completedjobsStore-housekeeper");
        completedJobsStoreThread.start();
      }
  
      // start the inter-tracker server once the jt is ready
      this.interTrackerServer.start();
  
      synchronized (this) {
        state = State.RUNNING;
      }
      LOG.info("Starting RUNNING");
  
      this.interTrackerServer.join();
      LOG.info("Stopped interTrackerServer");
    }
docs: Run forever