code: @Override
    public void shutdown() {
  
      // delay a little bit in case an added job is still taking it's time getting started right
      // before shutdown is called.
      try {
        //      System.out.println("waiting...");
        Thread.sleep(100);
      } catch (Exception ignore) {
      }
  
      if (shuttingDown || closed) {
        return;
      }
  
      shuttingDown = true;
  
      logger.info("Scheduler shutting down...");
  
      standby();
  
      this.quartzSchedulerThread.halt();
  
      notifySchedulerListenersShuttingdown();
  
      // notify Jobs, so they can gracefully shutdown
      List<JobExecutionContext> jobs = getCurrentlyExecutingJobs();
      for (JobExecutionContext job : jobs) {
        if (job.getJobInstance() instanceof InterruptableJob) {
          try {
            ((InterruptableJob) job.getJobInstance()).interrupt();
          } catch (Throwable e) {
            // do nothing, this was just a courtesy effort
            logger.warn(
                "Encountered error when interrupting job {} during shutdown: {}",
                job.getJobDetail().getName(),
                e);
          }
        }
      }
  
      logger.info("Threadpool shutting down...");
      quartzSchedulerResources.getThreadPool().shutdown();
  
      // Scheduler thread may have be waiting for the fire time of an acquired
      // trigger and need time to release the trigger once halted, so make sure
      // the thread is dead before continuing to shutdown the job store.
      try {
        this.quartzSchedulerThread.join();
      } catch (InterruptedException ignore) {
      }
  
      closed = true;
  
      shutdownPlugins();
  
      notifySchedulerListenersShutdown();
  
      logger.info("Scheduler shutdown complete.");
    }
docs: Halts the <code>QuartzScheduler</code>'s firing of <code>{@link org.quartz.triggers.Trigger}s
  </code>, and cleans up all resources associated with the QuartzScheduler.
  
  <p>The scheduler cannot be re-started.